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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top