none
Abfrage mit bedingter Ausgabe als unterschiedliche Spalten RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte gern eine Abfrage erreichen, die den ausgelesenen Wert entweder in der einen oder anderen Spalte ausgibt. Als Codeschnipsel erst mal folgendes:

    SELECT Datum, IIF(Produktion = 'true', SUM(DATEDIFF(minute, Start, Ende)) AS Laufzeit, SUM(DATEDIFF(minute, Start, Ende)) AS Stillstand)
    FROM Ereignisse
    GROUP BY Datum

    Als Ausgabe wünsche ich mir also die Gruppierung nach Datum, in der die eine Spalte mit Laufzeiten, die andere mit den Stillstandszeiten gefüttert wird, je nach dem, wie das Flag "Produktion" gesetzt ist.

    Die Ausgabe könnte dann ungefähr so aussehen:

    Datum      | Laufzeit | Stillstand
    ----------------------------------
    01.04.2017 |   120     |     23
    02.04.2017 |   265     |      9
    05.04.2017 |    11      |     44

    Diese Fragestellung habe ich im Netz bislang nicht finden können.
    Gibt es dafür eine Lösung?

    Vielen Dank!
    mmkeys




    • Bearbeitet mmkeys2 Donnerstag, 20. April 2017 14:56
    Donnerstag, 20. April 2017 14:47

Antworten

Alle Antworten

  • Hi,

    es wäre hilfreich, wenn Du uns die Tabellenstruktur als CREATE TABLE und die Beispieldaten, die zu dem gezeigten Ergebnis führen, als INSERT INTO Statements posten würdest.

    Generell würde ich die Daten mit einer Window Function vorfiltern und diese dann als Quelle für die Gruppierung verwenden.

    Also in etwa so:

    WITH Query AS
    (
        SELECT Datum,
               IIF( Produktion  = 'true', DATEDIFF( minute, Start, Ende ) ), 0 ) AS Laufzeit,
               IIF( Produktion <> 'true', DATEDIFF( minute, Start, Ende ) ), 0 ) AS Stillstand
        FROM   Ereignisse
    )
    SELECT   Datum,
             SUM( Laufzeit )   AS Laufzeit,
             SUM( Stillstand ) AS Stillstand
    FROM     Query
    GROUP BY Datum

    Das kann man natürlich auch anders machen, ich finde es so aber übersichtlicher.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 20. April 2017 15:09
    Moderator
  • Hallo Stefan,

    vielen Dank! Da recht neu in SQL-Anweisungen, war mir der Skill mit einer vorgelagerten Abfrage nicht bekannt. Es ist genau das, was ich brauchte.

    CREATE TABLE-Code habe ich nicht zur Hand, da alles schön im SQL Server Manager zusammengeklickt... ;)

    Grüße
    Manu

    Montag, 24. April 2017 07:22
  • Am 24.04.2017 schrieb mmkeys:

    CREATE TABLE-Code habe ich nicht zur Hand, da alles schön im SQL Server Manager zusammengeklickt... ;)

    Rechtsklick auf die Tabelle > Script für Tabelle > Create in. Den Rest
    kriegst Du sicherlich hin.

    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    HowTos zum WSUS Package Publisher http://www.wsus.de/wpp
    GPO's: http://www.gruppenrichtlinien.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/

    Dienstag, 25. April 2017 04:55
  • Something like that?

    USE [MDE]
    GO
    
    /****** Object:  Table [dbo].[Ereignisse]    Script Date: 25.04.2017 10:19:04 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Ereignisse](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Datum] [date] NOT NULL CONSTRAINT [DF_Maschinenzeiten_Laufzeit]  DEFAULT ('00:00:00'),
    	[Start] [time](0) NOT NULL CONSTRAINT [DF_Maschinenzeiten_Stillstand]  DEFAULT (NULL),
    	[Ende] [time](0) NULL,
    	[Menge] [int] NULL,
    	[Ausschuss] [int] NULL,
    	[Produktion] [bit] NOT NULL CONSTRAINT [DF_Maschinenzeiten_Produktion]  DEFAULT ((0)),
    	[Schichtstart] [time](0) NULL,
    	[Schichtende] [time](0) NOT NULL,
    	[FK_id_Maschine] [int] NOT NULL,
    	[FK_id_Betriebsauftrag] [int] NOT NULL,
    	[FK_id_Arbeitsgang] [int] NOT NULL,
    	[FK_id_Stillstandsgrund] [int] NULL,
    	[FK_id_Mitarbeiter] [int] NULL,
     CONSTRAINT [PK_Maschinenzeiten] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[Ereignisse] SET (LOCK_ESCALATION = AUTO)
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Arbeitsgänge_Ereignisse] FOREIGN KEY([FK_id_Arbeitsgang])
    REFERENCES [dbo].[Arbeitsgänge] ([ID])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Arbeitsgänge_Ereignisse]
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Betriebsauftraege_Ereignisse] FOREIGN KEY([FK_id_Betriebsauftrag])
    REFERENCES [dbo].[Betriebsaufträge] ([Id])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Betriebsauftraege_Ereignisse]
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Maschine_Ereignisse] FOREIGN KEY([FK_id_Maschine])
    REFERENCES [dbo].[Maschinen] ([Id])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Maschine_Ereignisse]
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Mitarbeiter_Ereignisse] FOREIGN KEY([FK_id_Mitarbeiter])
    REFERENCES [dbo].[Mitarbeiter] ([Id_MA])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Mitarbeiter_Ereignisse]
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Stillstandsgrund_Ereignisse] FOREIGN KEY([FK_id_Stillstandsgrund])
    REFERENCES [dbo].[Stillstandsgründe] ([Id])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Stillstandsgrund_Ereignisse]
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'rrrr' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Ereignisse', @level2type=N'CONSTRAINT',@level2name=N'Stillstandsgrund_Ereignisse'
    GO

    LG
    Manu

    Dienstag, 25. April 2017 08:20
  • Am 25.04.2017 schrieb mmkeys:

    Something like that?

    Genau, damit kann dann jeder die Tabelle selbst erstellen und einen
    Test durchführen. Du verstehst?

    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    HowTos zum WSUS Package Publisher http://www.wsus.de/wpp
    GPO's: http://www.gruppenrichtlinien.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/

    Dienstag, 25. April 2017 16:18
  • Jo, das bekommen meine Gehirnwindungen so gerade eben noch hin. ;)
    Danke für den Hinweis!

    Mahlzeit
    Manu

    Mittwoch, 26. April 2017 07:04