Zusammenfassen 2er Select-Abfragen bzw. Gruppierung mit neu-erstellter Spalte

Romero

Aktiver Benutzer
Beiträge
30
Hallöchen an euch,

sicherlich ist das für die Profis hier eine leichte Aufgabe, aber ich habe dazu aktuell nix passendes erlesen können, was mich nun erneut hierher bewegen lässt.

Ich habe eine 2fache Select-Abfrage in einem Statement gepackt. Diese sieht wie folgt aus:
Code:
USE [DB01]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [dbo].[Tabelle_Archiv]
AS
SELECT
                        DISTINCT
                        TOP (100) PERCENT
                        Wert1 AS [Auftrag],
                        Wert2 AS [Vorgangsnummer],
                        FORMAT(CONVERT(DATETIME, GETDATE()), 'dd.MM.yyyy HH:mm:ss') AS [Erstelldatum],

                        CASE    WHEN Wert3 = 'A1' OR Wert3 = 'A2' OR Wert4 = '1000' OR Wert4 = '1001' THEN 'PKW'
                                WHEN Wert3 = 'B1' OR Wert3 = 'B2' OR Wert4 = '2000' OR Wert4 = '2001' THEN 'LKW'
                                ELSE '' --hier könnten noch weitere Einteilungen hinzugefügt werden
                        END AS [ProduktionStrecke]

FROM
                       dbo.Tabelle1 As Wert1
                       dbo.Tabelle2 As Wert2
                       dbo.Tabelle3 As Wert3
                       dbo.Tabelle4 As Wert4

ORDER BY
                       [Vorgangsnummer] ASC

GO


CREATE VIEW [dbo].[Tabelle_Daily]
AS
SELECT
                        TOP (100) PERCENT
                        COUNT(*) As Anzahl,
                        [Vorgangsnummer],
                        [ProduktionStrecke],
                        [Erstelldatum]
                   
FROM
                        [dbo].[Tabelle_Archiv]

GROUP BY
                        [ProduktionStrecke], [Erstelldatum], [Vorgangsnummer]

ORDER BY
                        [Vorgangsnummer] ASC

GO

Auf diese Weise erhalte ich zu jeder Vorgangsnummer und ProduktionsStrecke die Gesamtanzahl an Aufträgen.
Da ich aber die Produktionsstrecke benötige, kann ich diese ja in der ersten erste Teil-Anweisung nicht bei GROUP BY unterbringen, da die SELECT-Anweisung erst "danach" ausgeführt wird, und die Spalte ProduktionsStrecke erst nach dem GROUP BY zur Verfügung steht.
Und bei der ersten erstellen VIEW habe ich zu jedem Auftrag die jeweilige ProduktionsStrecke definiert.
Diese definiere ich durch die 2 Spalten der Tabelle3 & Tabelle4. Je nach dem in welcher Tabelle die jeweiligen abzufragenden Werte drinstehen.

Wie kann ich aber dennoch diese beiden Anweisungen so mit einander Verknüpfen, dass ich am Ende genau das erhalte, was die zweite Zeil-Anweisung macht bzw. nur eine VIEW vorhanden ist.

LG Romero
 
Werbung:

MDDaniel

Aktiver Benutzer
Beiträge
32
Das ganze ist bisher nur graue Theorie, richtig?
Du hast da zwei Abfragen bzw Views hingegeben die weder funktionieren und daher auch keinen Sinn ergeben.
Im ersten View sind 4 Quelltabellen angegeben die nicht miteinander gejoint sind.

Hast du mehrfach die selben Einträge oder warum verwendest du ein Distinct in der ersten Abfrage?
 

Romero

Aktiver Benutzer
Beiträge
30
Ja, es kann schon zu Dopplungen kommen, aufgrund von technologischen Wartezeiten. Und da können am Ende, 2 oder mehrere Eintragungen stehen, wo ich aber am Ende zusammengefasst nur den Auftrag und die Vorgangsnummer benötige.
Man könnte es auch über MAX(Zeitstempel_Event) und hier immer den letzten Wert zur Zählung hinzufügen.

Nun aber zu deinem Post:
Jain, keine reine graue Theorie, da ich es ja schon so erstellt hatte. Also haben die Abfragen funktioniert und ich habe 2 neue VIEWs erstellen können, wo die 2. Abfrage auf die VIEW der 1. Abfrage zugreift.
Diese 4 Quelltabellen sind alle INNER JOIN, hatte ich hier vergessen (dachte, spielt bei der eigentlichen Frage der Zusammenfassung und Zählung keine Rolle).

Nun aber zur Ausgangsfrage:
Ich füge hier eine weitere Spalte hinzu, welche mittels eine CASE-Anweisung auf 2 weitere Spalten zugreift und die 2 Spalten gruppiert als (in diesem Beispiel) 'PKW' oder 'LKW' ausgibt.
Da GROUP BY ja vor der SELECT-Anweisung greift, wird die neue Spalte ja gar nicht erst herangezogen, welche aber für meine Gruppierung aber sehr wichtig ist.
Also ist meine Frage folgende: Kann ich die 2 SELECT-Abfragen zusammen fassen oder muss ich hier den Weg der 2 VIEWs gehen?

LG Romero
 

MDDaniel

Aktiver Benutzer
Beiträge
32
ann ich die 2 SELECT-Abfragen zusammen fassen oder muss ich hier den Weg der 2 VIEWs gehen?

Natürlich kann man Selects bauen die aufeinander aufsetzen. Sowas wird Subselect genannt.

Diese 4 Quelltabellen sind alle INNER JOIN, hatte ich hier vergessen
FROM dbo.Tabelle1 As Wert1 dbo.Tabelle2 As Wert2 dbo.Tabelle3 As Wert3 dbo.Tabelle4 As Wert4

Also ich sehe keinen Inner Join, dafür aber Feldnamen die dem Tabellennamen entsprechen. Daher mein Schluss das dieses Statement nicht das Original ist das nur anonymisiert wurde.
 

Romero

Aktiver Benutzer
Beiträge
30
ich habe hier mein Original bewusst weggelassen, da hier Firmen-interne Bezeichnungen verwendet wurden, welche ich nicht benennen wollte.
Daher habe ich u.a. beim FROM nur die Kurzfassung der Kurzfassung dargelegt.

Kann man mit diesem Subselect genau meine Frage beantworten? Also das ich erst die eine Abfrage mit der zusätzlichen Spalte kreiere, und wo ich dann genau auf diese Spalte eine 2. Abfrage aufsetze? Und das alles in einem Statement wo am Ende ggf. nur eine VIEW erstellt wird?
 

MDDaniel

Aktiver Benutzer
Beiträge
32
Wenn du es in deinem View zustande gebracht hast und es diese Abfrage gibt kannst du das gleiche im Subselect machen.
 
Werbung:

Romero

Aktiver Benutzer
Beiträge
30
Ah ok, also "klemme" ich die 1. Abfrage als Subselect in die 2. Abfrage.
Und diese 1. Abfrage dient ja dann als FROM-Statement oder? Da ja die erste Abfrage die 1. VIEW erstellt, worauf sich die 2. Abfrage bezieht.

Also müsste doch dann der Ausdruck wie folgt lauten(stark vereinfacht):

SELECT
-> Anweisung 2. Abfrage
FROM
-> (
SELECT
-> 1. Abfrage
FROM
-> Tabellen ...
WHERE
-> ...
) AS Ausgabe

GROUP BY
-> Ausgabe.die_Spalte_welche ich benötige, weitere...
 
Oben