Sql 通过PIVOT查找最高计数总数?
我有一个很大的数据集,其中我需要计算每个问题的“是”回答。我的查询如下所示:Sql 通过PIVOT查找最高计数总数?,sql,sql-server,pivot,Sql,Sql Server,Pivot,我有一个很大的数据集,其中我需要计算每个问题的“是”回答。我的查询如下所示: SELECT SUM(CASE (question1) WHEN 'Y' THEN 1 ELSE 0 END) as question1 , SUM(CASE (question2) WHEN 'Y' THEN 1 ELSE 0 END) as question2 , SUM(CASE (question3) WHEN 'Y' THEN 1 ELSE 0 END) as question3 , SUM(CASE (q
SELECT
SUM(CASE (question1) WHEN 'Y' THEN 1 ELSE 0 END) as question1
, SUM(CASE (question2) WHEN 'Y' THEN 1 ELSE 0 END) as question2
, SUM(CASE (question3) WHEN 'Y' THEN 1 ELSE 0 END) as question3
, SUM(CASE (question4) WHEN 'Y' THEN 1 ELSE 0 END) as question4
, SUM(CASE (question5) WHEN 'Y' THEN 1 ELSE 0 END) as question5
...... ( + dozens more ) ...
FROM myTable
name | value
--------------------
question1 | 346
question2 | 187
question3 | 240
question4 | 256
question5 | 261
这给了我一张这样的桌子:
question1 | question2 | question3 | question4 | question5 | ...
-------------------------------------------------------------------
346 | 187 | 240 | 256 | 261 | ...
好的。但我需要找到这一行中最高的3个值。我研究了PIVOT函数,试图将我的表转换为如下所示:
SELECT
SUM(CASE (question1) WHEN 'Y' THEN 1 ELSE 0 END) as question1
, SUM(CASE (question2) WHEN 'Y' THEN 1 ELSE 0 END) as question2
, SUM(CASE (question3) WHEN 'Y' THEN 1 ELSE 0 END) as question3
, SUM(CASE (question4) WHEN 'Y' THEN 1 ELSE 0 END) as question4
, SUM(CASE (question5) WHEN 'Y' THEN 1 ELSE 0 END) as question5
...... ( + dozens more ) ...
FROM myTable
name | value
--------------------
question1 | 346
question2 | 187
question3 | 240
question4 | 256
question5 | 261
但我真的不明白为什么。。。在示例代码的第节中,以及我应该如何列出“包含将成为列标题的值”的列,如文档所述:
PIVOT
(
<aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
... [last pivoted column])
) AS <alias for the pivot table>
PIVOT
(
()
对于
[]
在([第一个数据透视列],[第二个数据透视列],
…[最后一个数据透视列])
)作为
因为我有一个只有一行的表,所以我没有一个列将成为列标题。有谁能帮助我理解如何使用我的1行数据集——或者更好的是,用不同的方法来实现这一点?我觉得我可能错过了一些更简单的东西。同样,最终目标是找到总数最高的3个问题 我想这可以帮助你:
CREATE TABLE #X(ID INT IDENTITY,question1 INT,question2 INT,question3 INT ,question4 INT ,question5 INT)
INSERT INTO #X
select 346,187,240,256,261
select top 3 *
from (
select
id,
question,
[value]
from #X
unpivot([value] for question in(question1,question2,question3,question4,question5))P
)X
order by [value] desc
您不需要
PIVOT
,如果您想要获得这些结果,您需要使用UNPIVOT
。还有其他方法可以做到这一点,例如,您可以使用交叉应用
:
;WITH CTE AS
(
SELECT SUM(CASE (question1) WHEN 'Y' THEN 1 ELSE 0 END) as question1
, SUM(CASE (question2) WHEN 'Y' THEN 1 ELSE 0 END) as question2
, SUM(CASE (question3) WHEN 'Y' THEN 1 ELSE 0 END) as question3
, SUM(CASE (question4) WHEN 'Y' THEN 1 ELSE 0 END) as question4
, SUM(CASE (question5) WHEN 'Y' THEN 1 ELSE 0 END) as question5
...... ( + dozens more ) ...
FROM myTable
)
SELECT x.[name], x.Value
FROM CTE t
CROSS APPLY
(
VALUES
('question1', t.question1),
('question2', t.question2),
....
('questionN', t.questionN)
) x ([name], Value);
请放一些模拟表和行。伙计,我想用unpivot,在用order by value desc选择前三名之后,会解决你的问题。实际上,你需要
unpivot