SQL-Gruppierung
-
08-07-2019 - |
Frage
Ich habe eine Tabelle mit den folgenden Spalten:
A B C --------- 1 10 X 1 11 X 2 15 X 3 20 Y 4 15 Y 4 20 Y
ich gruppieren mag die Daten auf Basis der B- und C-Säulen und die unterschiedlichen Werte der A-Säule zählen. Aber wenn es zwei oder mehr Zeilen, in denen der Wert auf der A-Säule ist die gleiche mag ich den maximalen Wert aus der B-Säule erhalten.
Wenn ich eine einfache Gruppe durch das Ergebnis zu tun wäre:
B C Count -------------- 10 X 1 11 X 1 15 X 1 20 Y 2 15 Y 1
Was ich will, ist dieses Ergebnis:
B C Count -------------- 11 X 1 15 X 1 20 Y 2
Gibt es eine Abfrage, die dieses Ergebnis zurückgeben kann. Server ist SQL Server 2005.
Lösung
Ich mag in Schritten arbeiten: zuerst loswerden doppelten A-Datensätze erhält, dann die Gruppe. Nicht die effizienteste, aber es funktioniert auf Ihrem Beispiel.
with t1 as (
select A, max(B) as B, C
from YourTable
group by A, C
)
select count(A) as CountA, B, C
from t1
group by B, C
Andere Tipps
Ich habe dies tatsächlich getestet:
SELECT
MAX( B ) AS B,
C,
Count
FROM
(
SELECT
B, C, COUNT(DISTINCT A) AS Count
FROM
t
GROUP BY
B, C
) X
GROUP BY C, Count
und es gibt mir:
B C Count
---- ---- --------
15 X 1
15 y 1
20 y 2
WITH cteA AS
(
SELECT
A, C,
MAX(B) OVER(PARTITION BY A, C) [Max]
FROM T1
)
SELECT
[Max] AS B, C,
COUNT(DISTINCT A) AS [Count]
FROM cteA
GROUP BY C, [Max];
Überprüfen Sie dieses heraus. Dies sollte in Oracle arbeiten, obwohl ich es nicht getestet;
select count(a), BB, CC from
(
select a, max(B) BB, Max(C) CC
from yourtable
group by a
)
group by BB,CC