2016-08-09 24 views
2

Ich bin nicht sicher, wie Sie in SQL Folgendes tun. Ich habe versucht, GROUP BY und HAVING auf verschiedene Arten zu verwenden, aber keine funktioniert.Kombinieren von Einträgen in SQL

Ich habe eine Tabelle wie folgt aus:

Title Value 1 Value 2 ... 
0  3   7 
1  4   8 
2  5   9 
(empty) 6   10 
0  1   2 

Hier (empty) ist kein String. Ich lege es einfach hin, um zu zeigen, dass diese Tischzelle empty(null) ist. Ich möchte diese Tabelle mit nur einer Änderung anzeigen. Alle Zeilen mit Titel 0 or (empty) sind "kombiniert" in eine einzelne Zeile, mit Titel 0 und Wert 1 = Sum(all Value 1s), Wert 2 = Sum(all Value 2s). Alles andere bleibt gleich. im obigen Beispiel also, möchte ich sehen:

Title Value 1 Value 2 ... 
0  10  19 
1  4   8 
2  5   9 

Kann jemand bitte helfen?

Vielen Dank!

+0

Eine Integer-Spalte kann nicht sein, leer – Strawberry

+0

@Strawberry: ??? –

+0

@ThorstenKettner ???? – Strawberry

Antwort

3

Dies ist eine Aggregation Abfrage mit einem case:

SELECT 
IF(Title ='(empty)',0,Title) AS title_col, 
SUM(value1) as Value_1, 
SUM(value2) as Value_2 
FROM your_table 
GROUP BY title_col; 

:

select coalesce(title, 0) as title, 
     sum(value1) as value1, sum(value2) as value2 
from t 
group by coalesce(title, 0) 
order by title; 
2

Sie können diese versuchen:

select (case when title is null or title = 0 then 0 else title end) as title, 
     sum(value1) as value1, sum(value2) as value2 
from t 
group by (case when title is null or title = 0 then 0 else title end) 
order by title; 

Wenn Sie möchten, können Sie auch die Logik verwenden könnte Hinweis:

Wenn die Title Spalte tatsächlich diese Zeichenfolge enthält (empty) dann können Sie mit dieser Abfrage gehen.

EDIT:

Wenn der Datentyp der Spalte ist INT dann kann es Nullwert haben, wenn sie als ALLOW NULL erklärt wird.

Wenn ja, dann würde die Abfrage wie unten geändert:

SELECT 
IF(Title IS NULL,0,Title) AS title_col, 
SUM(value1) as Value_1, 
SUM(value2) as Value_2 
FROM your_table 
GROUP BY title_col; 
+0

Danke, aber wie gesagt, (leer) ist keine Zeichenkette. Ich lege es einfach dort hin, um zu zeigen, dass diese Zelle leer ist –

+0

Dann ist es null? Oder leere Zeichenfolge? By the way was ist der Datentyp der Titelspalte? – 1000111

+0

Null. Art der Spalte ist eigentlich int. Der Name "Titel" ist irreführend, aber ich habe es nicht gewählt. –

1

ich zwei Abfragen, einen für Titelsätze und einen für die Aggregation der nicht-Titel Aufzeichnungen zu sehen. Verwenden Sie UNION ALL auf die beiden Ergebnisse zusammenkleben:

select title, value1, value2 
from my table where coalesce(title, 0) <> 0 
union all 
select 0, sum(value1), sum(value2) 
from my table where coalesce(title, 0) = 0 
group by title 
order by title; 

(Im Falle, dass alle title <> 0 in der Tabelle eindeutig waren, könnten Sie eine einzelne Abfrage mit group by coalesce(title, 0) stattdessen verwenden.)

+0

Ich habe bereits eine Lösung gefunden, bevor Sie veröffentlicht, aber diese ist auch sehr gut. –

Verwandte Themen