在SQL中,如何计算列中的值的数量,然后将其旋转以使列成为行?

Jos*_*ger 5 sql reporting survey

我有一个调查数据库,每个问题有一列,每个人回答一行.每个问题的答案值为1到3.

Id    Quality?  Speed?
--    -------   -----
1     3         1
2     2         1
3     2         3
4     3         2
Run Code Online (Sandbox Code Playgroud)

现在,我需要将结果显示为每个问题一行,每个响应编号都有一列,每列中的值是使用该答案的响应数.最后,我需要计算总分,即1的数量再加上2的数量加上三次数的三倍.

Question  1    2    3    Total
--------  --   --   --   -----
Quality?  0    2    2    10
Speed?    2    1    1    7
Run Code Online (Sandbox Code Playgroud)

有没有办法在基于集合的SQL中执行此操作?我知道如何使用C#中的循环或SQL中的游标,但我试图使它在不支持游标的报告工具中工作.

Tom*_*m H 4

这会给你你所要求的:

SELECT
    'quality' AS question,
    SUM(CASE WHEN quality = 1 THEN 1 ELSE 0 END) AS [1],
    SUM(CASE WHEN quality = 2 THEN 1 ELSE 0 END) AS [2],
    SUM(CASE WHEN quality = 3 THEN 1 ELSE 0 END) AS [3],
    SUM(quality)
FROM
    dbo.Answers
UNION ALL
SELECT
    'speed' AS question,
    SUM(CASE WHEN speed = 1 THEN 1 ELSE 0 END) AS [1],
    SUM(CASE WHEN speed = 2 THEN 1 ELSE 0 END) AS [2],
    SUM(CASE WHEN speed = 3 THEN 1 ELSE 0 END) AS [3],
    SUM(speed)
FROM
    dbo.Answers
Run Code Online (Sandbox Code Playgroud)

但请记住,当您添加问题甚至潜在答案时,这个数字会迅速膨胀。如果您进行一点规范化,并有一个答案表,其中每个答案都有一行,并带有问题代码或 ID,而不是将它们作为列放在一个表中,情况可能会好得多。它开始看起来有点像实体值对设计,但我认为它足够不同,可以在这里有用。