MySQLクエリでそれを行う方法は次のとおりです。
select id,
sum(case when `1` = 'A' then 1 else 0 end) as CountA,
sum(case when `1` = 'B' then 1 else 0 end) as CountB,
sum(case when `1` = 'C' then 1 else 0 end) as CountC
from SurveyTable
group by id
order by id;
これは、限られたテスト データを使用したSQL Fiddleです。
補遺。カルロスは、次の回答につながる更新された構造を投稿しました。これらが近いことを願っています:)
これにより、総計を含む 1 つの非常に広い行が得られます。
select
sum(case when Q1 = 'A' then 1 else 0 end) as Q1CountA,
sum(case when Q1 = 'B' then 1 else 0 end) as Q1CountB,
sum(case when Q1 = 'C' then 1 else 0 end) as Q1CountC,
sum(case when Q2 = 'A' then 1 else 0 end) as Q2CountA,
sum(case when Q2 = 'B' then 1 else 0 end) as Q2CountB,
sum(case when Q2 = 'C' then 1 else 0 end) as Q2CountC,
sum(case when Q3 = 'A' then 1 else 0 end) as Q3CountA,
sum(case when Q3 = 'B' then 1 else 0 end) as Q3CountB,
sum(case when Q3 = 'C' then 1 else 0 end) as Q3CountC,
sum(case when Q4 = 'A' then 1 else 0 end) as Q4CountA,
sum(case when Q4 = 'B' then 1 else 0 end) as Q4CountB,
sum(case when Q4 = 'C' then 1 else 0 end) as Q4CountC,
sum(case when Q5 = 'A' then 1 else 0 end) as Q5CountA,
sum(case when Q5 = 'B' then 1 else 0 end) as Q5CountB,
sum(case when Q5 = 'C' then 1 else 0 end) as Q5CountC
from SurveyTable;
質問ごとに1行を取得したい場合は、これを試してください:
select
QuestionID,
sum(case when Answer = 'A' then 1 else 0 end) as CountA,
sum(case when Answer = 'B' then 1 else 0 end) as CountB,
sum(case when Answer = 'C' then 1 else 0 end) as CountC
from (
select 'Question1' as QuestionID, Q1 as Answer from surveytable
union all select 'Question2', Q2 from surveytable
union all select 'Question3', Q3 from surveytable
union all select 'Question4', Q4 from surveytable
union all select 'Question5', Q5 from surveytable) x
group by QuestionID
ここにフィドルがあります。
別の補遺: によって必要とされるカウント。行ごとにID
1 つあるため、は必要ありません。ID
SUM
これにより、アプローチが変わります。最初に答えをつなぎ合わせます。
concat(q1,q2,q3,q4,q5) -- result for ID=1 in the test data: 'ABCAC'
...次に、文字列からのすべての出現を吸い込みA
ます:
replace(concat(q1,q2,q3,q4,q5), 'A', '') -- result for ID=1: 'BCC'
... 最初の文字列 ( ABCAC
) は長さ5
、2 番目の文字列 ( BCC
) は長さ 3 です。長さの違いは、A
回答の数です: 2
。私が説明できるのはこのくらいです。クエリは次のとおりです。
select
id,
5 - length(replace(concat(q1,q2,q3,q4,q5), 'A', '')) AS CountA,
5 - length(replace(concat(q1,q2,q3,q4,q5), 'B', '')) AS CountB,
5 - length(replace(concat(q1,q2,q3,q4,q5), 'C', '')) AS CountC
from surveytable;
更新された Fiddle はこちらです。
これにより、生データのみが得られます。書式設定は少しトリッキーですが、特にフロントエンド言語で行う場合は、それほど悪くはありません。これに MySQL を使用する必要がある場合は、上記をサブクエリに入れて、外側のクエリにフォーマットを適用する方がおそらく簡単です。
select
id,
CONCAT('You have chosen ' ...and miles of formatting logic using CountA, etc)
from (
select
id,
5 - length(replace(concat(q1,q2,q3,q4,q5), 'A', '')) AS CountA,
5 - length(replace(concat(q1,q2,q3,q4,q5), 'B', '')) AS CountB,
5 - length(replace(concat(q1,q2,q3,q4,q5), 'C', '')) AS CountC
from surveytable) x