我有多项多项选择调查问卷的答复。我的目标是统计回答“A”、“B”等的受访者数量,并进一步处理该数据。
(原始数据采用 JSON 格式,但这也可能是表数据。JSON 格式并不是真正的因素,但如果有更好的方法从 JSON 获取结果,那么我愿意接受想法)。
我有两种计算回复的方法,但我的方法只能为每个问题生成一组总数。
方法一:求和
DECLARE @json NVARCHAR(MAX);
SET @json = N'[
{"q1": "B", "q2": "B"},
{"q1": "C", "q2": "C"},
{"q1": "D", "q2": "C"},
{"q1": "A", "q2": "B"},
{"q1": "A", "q2": "B"},
{"q1": "C", "q2": "A"},
{"q1": "C", "q2": "B"}
]';
SELECT
Count(*) as total,
sum(case when q1 = 'A' then 1 else 0 end) as A,
sum(case when q1 = 'B' then 1 else 0 end) as B,
sum(case when q1 = 'C' then 1 else 0 end) as C,
sum(case when q1 = 'D' then 1 else 0 end) as D
FROM OPENJSON(@json)
WITH (
q1 NVARCHAR(50) '$.q1',
q2 NVARCHAR(50) '$.q2'
)
结果:
方法 2:透视
DECLARE @json NVARCHAR(MAX);
SET @json = N'[
{"q1": "B", "q2": "B"},
{"q1": "C", "q2": "C"},
{"q1": "D", "q2": "C"},
{"q1": "A", "q2": "B"},
{"q1": "A", "q2": "B"},
{"q1": "C", "q2": "A"},
{"q1": "C", "q2": "B"}
]';
SELECT *
FROM OPENJSON(@json)
WITH (
q1 NVARCHAR(50) '$.q1'
) t
PIVOT(
COUNT(q1)
FOR q1 IN
(
[A],
[B],
[C],
[D]
)
) as pivot_table
结果:
期望的结果
有没有一种方法可以用一个语句来计算所有问题?
最佳答案
我认为 WITH
可能会得到 q1,q2
而不是 q1,q1
因为q1
和q2
是两列,我们可以尝试使用CROSS APPLY
值进行逆透视,然后使用聚合条件函数.
SELECT
v.Question,
sum(case when v.val = 'A' then 1 else 0 end) as A,
sum(case when v.val = 'B' then 1 else 0 end) as B,
sum(case when v.val = 'C' then 1 else 0 end) as C,
sum(case when v.val = 'D' then 1 else 0 end) as D
FROM OPENJSON(@json)
WITH (
q1 NVARCHAR(50) '$.q1',
q2 NVARCHAR(50) '$.q2'
)
CROSS APPLY (VALUES ('q1',q1),('q2',q2)) v(Question,val)
GROUP BY v.Question
关于SQL:计算多项选择结果的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72373305/