Gruppe durch, wenn zweimal die gleiche Tabelle Beitritt
Frage
Ich schreibe eine Abfrage einige Daten zusammenzufassen. Ich habe eine Fahne in der Tabelle, die im Grunde boolean ist, so brauche ich einige Summen und Zählungen basierend auf einem Wert, und dann das gleiche für den anderen Wert, etwa so:
select
location
,count(*)
,sum(duration)
from my.table
where type = 'X'
and location = @location
and date(some_tstamp) = @date
group by location
Und dann das gleiche für einen anderen Wert des Typs Spalte. Wenn ich diese Tabelle zweimal kommen, wie kann ich noch Gruppe so dass ich nur die Aggregation für jede Tabelle bekommen, das heißt count (a.*
) anstelle von COUNT (*) ...
Wäre es besser, zu schreiben, zwei separate Abfragen?
Bearbeiten
Vielen Dank allen, aber das ist nicht das, was ich meinte. Ich brauche eine Zusammenfassung wo type = ‚X‘ und eine Zusammenfassung zu bekommen, wo type = ‚Y‘ separat ... lassen Sie mich ein besseres Beispiel abgeben. Was ich meinte, war eine Abfrage wie folgt:
select
a.location
,count(a.*)
,sum(a.duration)
,count(b.*)
,sum(b.duration)
from my.table a, my.table b
where a.type = 'X'
and a.location = @location
and date(a.some_tstamp) = @date
and b.location = @location
and date(b.some_tstamp) = @date
and b.type = 'Y'
group by a.location
Was muss ich zu einer Gruppe müssen durch? Auch dann, wenn DB2 nicht wie count (a.*
), es ist ein Syntaxfehler.
Lösung
select
location
,Sum(case when type = 'X' then 1 else 0 end) as xCount
,Sum(case when type = 'Y' then 1 else 0 end) as YCount
,Sum(case when type = 'X' then duration else 0 end) as xCountDuration
,Sum(case when type = 'Y' then duration else 0 end) as YCountDuration
from my.table
where
location = @location
and date(some_tstamp) = @date
group by location
Dies sollte in SQL Server arbeiten. Ich denke, db2 etwas ähnliches haben.
Edit: In einer where Bedingung die Datensätze zu begrenzen type = X oder type = Y wählen, wenn "Typ" kann anderen Wert als X und Y haben
Andere Tipps
Ihr Beispiel mit der Join nicht viel Sinn machen. Sie sind ein Kartesisches Produkt zwischen A und B. tun Ist das wirklich das, was Sie wollen?
Im Folgenden wird count (*) und die Summe (Dauer) für jedes Paar finden, die die WHERE-Klausel erfüllt. Basierend auf Ihrer Beschreibung, das klingt wie das, was Sie suchen:
select
type
,location
,count(*)
,sum(duration)
from my.table
where type IN ('X', 'Y')
and location = @location
and date(some_tstamp) = @date
group by type, location
Um die Zählungen funktioniert, statt count (a. *) Nur zählen (a.location) oder eine beliebige andere nicht-Null-Spalte (die PK wäre ideal).
In Bezug auf die Hauptfrage, eine der beiden Antworten von shahkalpesh oder George Eadon oben funktionieren würde. Es gibt keinen Grund, in diesem Beispiel zweimal die Tabelle zu verbinden.