2016-05-16 16 views
6

Mi sembra che questo dovrebbe essere abbastanza semplice, ma non riesco a trovare una soluzione. Supponiamo che io ho la seguente tabella:Valore specifico del conteggio SQL su più colonne e righe

|--------||---||---||---||---||---||---||---| 
|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 | 

voglio contare il numero di volte '1' appare nella tabella, quindi la query deve, in questo caso, portare con 12. Ho provato 'brutalmente' it , come la seguente query. Ma questo si traduce solo nelle righe contenenti un 1, quindi in questo caso 4. Come faccio a contare il numero di volte che si verifica '1', ottenendo così un conteggio di 12?

SELECT COUNT(*) 
FROM table 
WHERE Company = 'abc' 
AND (
q1 = '1' 
OR q2 = '1' 
OR q3 = '1' 
OR q4 = '1' 
OR q5 = '1' 
OR q6 = '1' 
OR q7 = '1' 
) 
+0

'E '1' IN (Q1, Q2, Q3, Q4, Q5, Q6, Q7)' – Alex

+0

No, che si traduce in COUNT 4 così – Merin

+0

a cuore, il motivo per il vostro approccio non ha fatto e non può funzionare è che 'count()' conta le righe e quindi un set di 1 su più colonne verrà conteggiato una sola volta. – shawnt00

risposta

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

Finito utilizzando questa soluzione, esattamente quello che stavo cercando! – Merin

3

Non è così facile, ogni colonna deve essere hardcoded. Proverei qualcosa usando un CASE o DECODE.

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' 

Utilizzando un SUM invece di un COUNT vi permettono la dichiarazione CASE di essere SUM ed.

+0

Solo le preferenze personali, entrambe le query eseguono lo stesso risultato ma usando 'count' renderebbe più facile per gli altri sapere cosa stai cercando di fare. –

3

uso condizionato 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

Questo è molto strano, ma l'assegnazione:

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

Questa è la risposta più breve (e più chiara), basandosi sul fatto che i booleani sono effettivamente trattati come interi '0' o' 1' in MySQL. L'aggiunta di AND '1' IN (q1, q2, q3, q4, q5, q6, q7) probabilmente lo rende anche il più efficiente. –

+0

grazie per la tua opinione :-) – Alex

2

Per ragioni di efficienza Non consiglio in realtà utilizzando questo approccio; ma per gli scopi di apprendimento ecco un altro modo in cui potresti aver suddiviso il problema sulla falsariga del modo in cui ci stavi pensando.

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