使用Pivot的SQL查询
我的表格如下:使用Pivot的SQL查询,sql,sql-server,sql-server-2005,sql-server-2008,Sql,Sql Server,Sql Server 2005,Sql Server 2008,我的表格如下: PriorityText Priority LoRes Partial Unknown N_A HiRes ------------------------------------------------------------------ Very High 5 0.0612 0.0000 0.0612 0.0612 0.2041 High 4 0.1429 0.0000 0.1
PriorityText Priority LoRes Partial Unknown N_A HiRes
------------------------------------------------------------------
Very High 5 0.0612 0.0000 0.0612 0.0612 0.2041
High 4 0.1429 0.0000 0.1633 0.0000 0.1633
Medium 3 0.0000 0.0000 0.1020 0.0000 0.0408
Low-Medium 2 0.0000 0.0000 0.0000 0.0000 0.0000
Low 1 0.0000 0.0000 0.0000 0.0000 0.0000
Priority PriorityText LoRes Partial Unknown N_A HiRes
1 VeryHigh 0.05 11 54 0 9
2 High 0.14 22 54 0 3
3 Medium 0.07 33 65 0 7
4 Low-Medium 0.01 44 87 0 4
5 Low 0 55 9 0 0
NULL NULL NULL NULL NULL NULL NULL
我想把表格换成这样:
PriorityText Low Low-Medium Medium High Very High
--------------------------------------------------------
Priority 1 2 3 4 5
LoRes 0 0 0 0.1429 0.0612
Partial 0 0 0 0 0
Unknown 0 0 0.102 0.1633 0.0612
N_A 0 0 0 0 0.0612
HiRes 0 0 0.0408 0.1633 0.2041
我正在使用SQL2008。我很难想出SQL语法来执行数据透视
有人能分享一个SQL代码片段来帮我解决这个问题吗
我已经使用以下方法成功地透视了一行,但我不知道如何使它完成我所有的行
SELECT VeryHigh AS VeryHigh,
High AS High,
Medium AS Medium,
[Low-Medium] AS [Low-Medium],
Low AS Low
FROM (SELECT [PriorityText], [LoRes] FROM @tbTemp) p
PIVOT (SUM(LoRes) FOR [PriorityText] in ([VeryHigh], [High], [Medium], [Low-Medium], [Low])) pvt
我表中的测试数据如下:
PriorityText Priority LoRes Partial Unknown N_A HiRes
------------------------------------------------------------------
Very High 5 0.0612 0.0000 0.0612 0.0612 0.2041
High 4 0.1429 0.0000 0.1633 0.0000 0.1633
Medium 3 0.0000 0.0000 0.1020 0.0000 0.0408
Low-Medium 2 0.0000 0.0000 0.0000 0.0000 0.0000
Low 1 0.0000 0.0000 0.0000 0.0000 0.0000
Priority PriorityText LoRes Partial Unknown N_A HiRes
1 VeryHigh 0.05 11 54 0 9
2 High 0.14 22 54 0 3
3 Medium 0.07 33 65 0 7
4 Low-Medium 0.01 44 87 0 4
5 Low 0 55 9 0 0
NULL NULL NULL NULL NULL NULL NULL
谢谢你的帮助 不确定如何进行硬编码,但您要做的是将行与列转置
SELECT p.[Type] as 'PriorityText', Low, [Low-Medium], Medium,High,[VeryHigh]
FROM (SELECT PriorityText, [Holder],[Type]
FROM (SELECT PriorityText,Priority,LoRes,[Partial],Unknown,N_A,HiRes
FROM Test) as sq_source
UNPIVOT ([Holder] FOR [Type] IN
(Priority,LoRes,[Partial],Unknown,N_A,HiRes)) as sq_up
) as sq
PIVOT (
MIN([Holder])
FOR PriorityText IN
(VeryHigh,High,Medium,[Low-Medium],Low)
) as p
order by CASE p.[Type] WHEN 'Priority' THEN 1
WHEN 'LoRes' THEN 2
WHEN 'Partial' THEN 3
WHEN 'Unknown' THEN 4
WHEN 'N_A' THEN 5
ELSE 6 END ASC;
这应该能满足你的需要。需要注意的一点是,这仅在以下列中有效:
- 优先权
- 传说
- 局部的
- 不为人知
- 努阿
- 雇用
都是相同的数据类型(在我的测试中是十进制(5,4))。如果您的结果不同,则需要进行初始选择,并将其转换为通用数据类型,并将其用作sq_源。对于我来说,预期结果中的优先级行在DB设计方面没有意义。它与其他行的类型不同,因此它不属于同一个数据集。我接受了您的查询并用我的表名替换了“Test”,我得到了如下错误:“Msg 8167,Level 16,State 1,Line 7列“LoRes”的类型与UNPIVOT列表中指定的其他列的类型冲突。”我还需要做其他事情吗?我在底部提到,[Priority]、[LoRes]、[Partial]、[Unknown]、[N_A]和[HiRes]列需要是相同的数据类型。e、 g.如果除知识外,你所有的知识都是十进制(5,4),那么你需要将知识转换为十进制(5,4)。如果您发送表的创建脚本,我将能够修改sql以满足您的需要。