SQL:计算多项选择结果的答案

标签 sql json sql-server

我有多项多项选择调查问卷的答复。我的目标是统计回答“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'
  ) 

结果:

<表类=“s-表”> <标题> 总计 一个 B C D <正文> 7 2 1 3 1

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

结果:

<表类=“s-表”> <标题> 一个 B C D <正文> 2 1 3 1

期望的结果

有没有一种方法可以用一个语句来计算所有问题?

<表类=“s-表”> <标题> 问题 一个 B C D <正文> q1 2 1 3 1 q2 1 3 2 0

最佳答案

我认为 WITH 可能会得到 q1,q2 而不是 q1,q1

因为q1q2是两列,我们可以尝试使用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

sqlfiddle

关于SQL:计算多项选择结果的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72373305/

相关文章:

sql - 将 SQL 用于 rails 参数/值

sql - dbms_output 无法打印 boolean 值?

php - php数据库如何查找年龄20岁以上25岁以下的用户

php - 将 JSON 输出打印到表中 - PHP

javascript - 如何使用 JSON API?

javascript - 如何解释node.js中带有 '-'的JSON字段

php - SQL Server 的插入忽略的替代方案

SQL:访问查询唯一满足多个条件

SQL Server输出参数问题

sql - 查询以选择 "More Complete"重复记录