Benutzer mit den meisten Antworten
Abfrage mit bedingter Ausgabe als unterschiedliche Spalten

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
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- Als Antwort vorgeschlagen Christoph Muthmann Montag, 24. April 2017 12:27
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 28. April 2017 10:35
-
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/- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 28. April 2017 10:36
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- Als Antwort vorgeschlagen Christoph Muthmann Montag, 24. April 2017 12:27
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 28. April 2017 10:35
-
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 -
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/ -
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 -
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/- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 28. April 2017 10:36