2016-08-02 13 views
1

I-Daten haben gezeigt, dass so etwas wie dieses ich eine AbfrageGruppe von Spalte A, Gruppe Kombination von Werten in Spalte B und bekommen Summe von B

+-----+-----+ 
| A | B | 
+-----+-----+ 
| 1 | a | 
| 1 | a | 
| 1 | b | 
| 1 | b | 
| 1 | c | 
| 2 | a | 
| 2 | a | 
| 2 | b | 
| 3 | b | 
| 3 | a | 
+-----+-----+ 

sieht brauchen so etwas wie diese geben mir.

+-----+-----+-----+ 
| A | B | sum | 
+-----+-----+-----+ 
| 1 | a+b | 4 | 
| 1 | c+d | 1 | 
| 2 | a+b | 3 | 
| 2 | c+d | 0 | 
| 3 | a+b | 2 | 
| 3 | c+d | 0 | 
+-----+-----+-----+ 

Genauer gesagt in Grails in einer withCriteria. Ich kann es vielleicht arbeiten lassen, oder anpassen, wenn es gerade mysql ist. Ich brauche, wo ich gruppiere durch A, aber will die sekundäre Gruppe B eine Kombination von 2 verschiedenen Werten und dann eine Summe der Anzahl dieser Kombination in B.

Ich habe einige ähnliche Beispiele mit CASE gesehen aber ich habe keine gesehen, wo sie die Werte in einer Spalte kombinieren, um eine Zählung zu erhalten.

Antwort

2

Dies ist ein bisschen schwierig, weil Sie die IDs für Datensätze anzeigen möchten, die nicht vorhanden sind. Sie können das mit einer Unterabfrage und einem cross join tun. Verwenden Sie dann auf die ursprüngliche Tabelle einen outer join zurück und conditional aggregation Ihre Ergebnisse zu erhalten:

select t.a, t.b, 
    count(case when t.b = 'a+b' and y.b in ('a','b') then 1 
     when t.b = 'c+d' and y.b in ('c','d') then 1 
     end) 
from ( 
    select distinct t.a, 
     t2.b 
    from yourtable t 
     cross join (select 'a+b' b union all select 'c+d') t2 
) t left join yourtable y on t.a = y.a 
group by t.a, t.b 
+0

sorry für die langsame Reaktion, Vielen Dank, das funktioniert! –

Verwandte Themen