2016-05-16 14 views
6

Ich fühle mich, als ob dies ziemlich einfach sein sollte, aber scheint keine Lösung zu finden. Angenommen, ich habe die folgende Tabelle:SQL count spezifischen Wert über mehrere Spalten und Zeilen

|--------||---||---||---||---||---||---||---| 
|Company ||q1 ||q2 ||q3 ||q4 ||q5 ||q6 ||q7 | 
|--------||---||---||---||---||---||---||---| 
|abc  ||1 ||2 ||1 ||3 ||2 ||2 ||1 | 
|abc  ||2 ||2 ||1 ||2 ||3 ||1 ||1 | 
|abc  ||1 ||1 ||3 ||3 ||1 ||2 ||2 | 
|abc  ||1 ||2 ||1 ||3 ||0 ||1 ||3 | 

Ich mag die Anzahl der ‚1‘ in der Tabelle erscheint zählen, so dass die Abfrage sollte in diesem Fall ergibt sich mit 12. Ich habe versucht, ‚hartzucodieren‘ it , wie die folgende Abfrage. Aber das führt nur dazu, dass die Zeilen eine 1 enthalten, also in diesem Fall 4. Wie zähle ich, wie oft '1' auftritt, was zu einer Zählung von 12 führt?

+0

'und '1' IN (q1, q2, q3, q4, q5, Q6, Q7)' – Alex

+0

Nö, dass die Ergebnisse in COUNT 4 als auch – Merin

+0

Im Grunde ist der Grund, Ihr Ansatz nicht tat und kann nicht funktionieren ist, dass 'count()' Zeilen zählt und so eine Menge von 1en über mehrere Spalten hinweg nur ein einziges Mal gezählt wird. – shawnt00

Antwort

5
SELECT SUM(
    IF(q1 = 1, 1, 0) + 
    IF(q2 = 1, 1, 0) + 
    IF(q3 = 1, 1, 0) + 
    IF(q4 = 1, 1, 0) + 
    IF(q5 = 1, 1, 0) + 
    IF(q6 = 1, 1, 0) + 
    IF(q7 = 1, 1, 0) 
) 
FROM table 
WHERE Company = 'abc' 
+0

Beendet mit dieser Lösung, genau das, was ich gesucht habe! – Merin

3

Nicht so einfach, jede Spalte muss fest codiert sein. Ich würde etwas mit einem CASE oder DECODE versuchen.

SELECT 
SUM(
CASE WHEN q1 = 1 THEN 1 ELSE 0 END + 
CASE WHEN q2 = 1 THEN 1 ELSE 0 END + 
CASE WHEN q3 = 1 THEN 1 ELSE 0 END + 
CASE WHEN q4 = 1 THEN 1 ELSE 0 END + 
CASE WHEN q5 = 1 THEN 1 ELSE 0 END + 
CASE WHEN q6 = 1 THEN 1 ELSE 0 END + 
CASE WHEN q7 = 1 THEN 1 ELSE 0 END) 
FROM table 
WHERE Company = 'abc' 

eine SUM anstelle eines COUNT Verwendung wird die CASE Aussage erlauben SUM ed zu sein.

+0

Nur persönliche Präferenz, führen beide Abfrage das gleiche Ergebnis, aber mit 'count' würde es für andere einfacher zu wissen, was Sie versuchen, zu tun. –

3

Verwendung bedingte COUNT

SELECT COUNT(case when q1 = '1' then 1 end) + 
     COUNT(case when q2 = '1' then 1 end) + 
     COUNT(case when q3 = '1' then 1 end) + 
     COUNT(case when q4 = '1' then 1 end) + 
     COUNT(case when q5 = '1' then 1 end) + 
     COUNT(case when q6 = '1' then 1 end) + 
     COUNT(case when q7 = '1' then 1 end) as ones_total 
FROM table 
WHERE Company = 'abc' 
4

Diese sehr seltsam Zuordnung ist aber:

http://sqlfiddle.com/#!9/2e7aa/3

SELECT SUM((q1='1')+(q2='1')+(q3='1')+(q4='1')+(q5='1')+(q6='1')+(q7='1')) 
FROM table 
WHERE Company = 'abc' 
AND '1' IN (q1,q2,q3,q4,q5,q6,q7) 
+0

Dies ist die kürzeste (und klarste) Antwort, die sich auf die Tatsache verlässt, dass Boolesche in MySQL tatsächlich als Ganzzahlen "0" oder "1" behandelt werden. Die Addition von AND '1' IN (q1, q2, q3, q4, q5, q6, q7) macht es vermutlich auch am effizientesten. –

+0

danke für deine meinung :-) – Alex

2

Aus Gründen der Effizienz empfehle ich nicht wirklich mit diesem Ansatz; aber zu Lernzwecken hier ist eine andere Möglichkeit, wie Sie das Problem entlang der Art und Weise, wie Sie darüber nachdenken, hätten abbauen können.

select sum(c) as total_ones 
from 
    (
    select count(*) c from table where q1 = 1 union all 
    select count(*) from table where q2 = 1 union all 
    select count(*) from table where q3 = 1 union all 
    select count(*) from table where q4 = 1 union all 
    select count(*) from table where q5 = 1 union all 
    select count(*) from table where q6 = 1 union all 
    select count(*) from table where q7 = 1 
    ) t