Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SqlServer中使用PIVOT将行转换为列_Sql_Sql Server - Fatal编程技术网

如何在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一起工作?;)