2016-05-16 7 views
6

これは非常に簡単であるように感じますが、解決策を見つけることはできません。 私は、次の表があるとします。クエリは、このケースでは、12になる必要がありますので、複数の列と行にわたるSQLカウントの特定の値

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

私は倍の「1」の数をカウントしたいことは、私はそれを「ハードコーディング」しようとした、テーブルに表示されます。次のクエリのように。しかし、それは結果として1行を含むので、この場合は4になります。どのようにして '1'の回数がカウントされ、結果的に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

'AND '1' IN(Q1、Q2、Q3、Q4、Q5、Q6、Q7)' – Alex

+0

いや、その心臓部にも – Merin

+0

COUNT 4の結果、あなたのアプローチはしなかった理由と'count()'は行を数えるので、複数の列にまたがる1の集合は1回だけカウントされます。 – shawnt00

答えて

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

このソリューションを使用して、私が探していたものを完成させました! – Merin

3

各列をハードコードする必要があります。私はCASEまたはDECODEを使って試してみたいと思います。 SUM代わりのCOUNTを使用して

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' 

CASE文がSUM EDできるようになります。

+0

個人的には両方のクエリで同じ結果が得られますが、 'count'を使うと他人が何をしようとしているのかが分かりやすくなります。 –

3

使用条件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

これは非常に奇妙な代入ですが、私はこのアプローチを使用して、実際にはお勧めしません効率の理由から

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

これは、ブール値が実際にはMySQLで整数「0」または「1」として扱われるという事実を利用して、最も短い(そして最も明確な)答えです。 'AND' 1 IN(q1、q2、q3、q4、q5、q6、q7)の加算によって、おそらく最も効率的になります。 –

+0

あなたのご意見ありがとうございます:-) – Alex

2

。学習目的のために、あなたがそれについて考えていた方法のラインに沿って問題を分解することができる別の方法があります。

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 
関連する問題