如何在SqlServer中使用PIVOT将行转换为列
我有这张桌子:如何在SqlServer中使用PIVOT将行转换为列,sql,sql-server,Sql,Sql Server,我有这张桌子: Dimension Meaning --------- ------- Browser IE9 Browser IE10 Module Ticket Module Board OS Windows OS Ios OS Linux 我想要所有可能的组合: Browser Module OS ------- ------ ------ IE9
Dimension Meaning
--------- -------
Browser IE9
Browser IE10
Module Ticket
Module Board
OS Windows
OS Ios
OS Linux
我想要所有可能的组合:
Browser Module OS
------- ------ ------
IE9 Ticket Windows
IE9 Ticket Ios
IE9 Ticket Linux
IE10 Board Windows
IE10 Board Ios
IE10 Board Linux
等等。。。源表不会有太大的增长,所以这里不需要特别的性能,我不介意对列进行硬编码
我当前正在使用此查询,但只得到一行:
SELECT [Browser],[Module],[Os] FROM
(
SELECT Meaning, Dimension
FROM [Mits].[dbo].[ToolHintValues]
) x
pivot
(
MAX(Meaning)
FOR Dimension IN ([Browser],[Module],[Os])
) p
有没有关于如何获得所有组合的帮助?
提前谢谢
更新:
这是仍返回一行的动态sql版本:
DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(Dimension)
from [dbo].[ToolHintValues]
group by Dimension
order by Dimension
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' FROM
(
SELECT Meaning, Dimension
FROM [dbo].[ToolHintValues]
) x
pivot
(
MAX(Meaning)
FOR Dimension IN (' + @cols + N')
) p '
SELECT @query
exec sp_executesql @query;
如果您知道尺寸是什么,可以使用
交叉连接:
select b.meaning as browser, m.meaning as module, o.meaning as os
from (select distinct meaning from thistable where dimension = 'browser'
) b cross join
(select distinct meaning from thistable where dimension = 'module'
) m cross join
(select distinct meaning from thistable where dimension = 'os'
) o;
如果您不知道所有维度,那么您将不得不使用动态SQL执行更复杂的操作。SQL查询返回一组固定的列;要有一个变量,需要动态SQL。如果我理解正确,有12种组合。为什么你只列出六个?是的,12个组合,我只是不想写全部,这就是为什么我写了“所有可能的组合”#Linoff先生,你能简单解释一下如何通过动态查询使用吗?刚刚添加了我的动态sql,但仍然只得到一行。@AlexMetalex。您是说上面的查询只返回一行吗?Pivot不是获取所有组合的正确方法<代码>交叉连接
是。@GordonLinoff是的,交叉连接是正确的。有没有机会让它与动态SQL一起工作?;)