一尘不染

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

sql

我有一个调查数据库,每个问题一栏,每个回答者一行。每个问题的答案均​​介于1到3之间。

Id    Quality?  Speed?
--    -------   -----
1     3         1
2     2         1
3     2         3
4     3         2

现在,我需要将结果显示为每个问题一行,每个响应编号对应一列,每列中的值是使用该答案的响应数量。最后,我需要计算总得分,即1的数量加2的数量的两倍乘以3的数量的三倍。

Question  1    2    3    Total
--------  --   --   --   -----
Quality?  0    2    2    10
Speed?    2    1    1    7

有没有办法在基于集合的SQL中做到这一点?我知道如何使用C#中的循环或SQL中的游标来执行此操作,但是我正在尝试使其在不支持游标的报告工具中工作。


阅读 128

收藏
2021-05-23

共1个答案

一尘不染

这将给您您所要的:

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

请记住,这会在您添加问题甚至可能的答案时迅速膨胀。如果稍微标准化一下,并为每个答案都带有一行带有问题代码或ID的答案做一个答案表,而不是将它们作为一列放在一个表中,则可能会更好。它开始看起来有点像实体-
值对设计,但我认为它的区别足以在此处使用。

2021-05-23