2016-07-21 12 views
1

Ich bin kein SQL-Experte, also bitte entschuldigen Sie, wenn das zu einfach ist. Ich habe einen Tisch, in dem die Marken von Kunden gespeichert werden, die bis zu zwei Marken auswählen können. Ich muss die einzelnen Markeneinträge und die Kombinationen zählen, aber ich habe Probleme, die Kombination von a + b genauso wie b + a zu betrachten. Bisher habe ich bekam:Zählen von Duplikaten aus zwei Spalten in einer SQL-Tabelle

SELECT DISTINCT brand, brand2, count(*) FROM table GROUP BY brand, brand2;

Dies wird mir diese Ausgabe aus dieser Tabelle und „erwünscht“ ist, was ich suche

 table     output      desired 

brand | brand2|  brand | brand2| count(*)| brand | brand2| count(*)| 
    a | b |  a | b |  1 |  a | b |  2 | 
    b |  |  b |  |  2 |  b |  |  2 | 
    c | b |  c | b |  1 |  c | b |  2 | 
    b |  |  b | a |  1 |  e |  |  1 | 
    b | a |  b | c |  1 | 
    b | c |  e |  |  1 | 
    e |  | 

bekommen Ich hoffe, das ist klar, ich Ich bin hier wirklich blockiert. Nicht sicher, wie ich die Ausgabe bekommen kann, die ich brauche. Ich schätze jede Hilfe.

+0

ist es Zeit, wie diese, die ich wünschte, ich die Datenbank normalisiert hatte ... – Jasen

Antwort

1

Try this:

select 
    substring_index(concat_ws(',', `brand`, `brand2`), ',', 1) as `brand`, 
    substring_index(concat_ws(',', `brand`, `brand2`), ',', -1) as `brand2`, 
    count(*) 
from yourtable 
group by case when `brand` > `brand2` then concat(`brand`, `brand2`) 
       else concat(`brand2`, `brand`) end 
order by `brand` 

SqlFiddle Demo

+0

die Zeilen in der Ausgabe zeigen zufällig zu ändern scheint. abhängig von der Eingabe Bestellung ... http://sqlfiddle.com/#!9/a02d81/3 – Jasen

+0

@Jasen Du hast absolut Recht. Ich gebe nur eine Zeile für jede Gruppe hier zurück, auch die OP gab uns nicht, welche zu reservieren. Und deine Antwort ist definitiv richtig, es ist großartig. – Blank

1

hier eine Möglichkeit, die Standard-SQL verwendet.

select 
    case when brand >= brand2 and brand2 <>'' then brand2 else brand end as `brand`, 
    case when brand >= brand2 and brand2 <>'' then brand else brand2 end as `brand2`, 
    count(*) 
from yourtable 
group by 1,2    
order by 1,2 

fiddle here

+0

Große Antwort. +1 – Blank

Verwandte Themen