0

数据库:Microsoft SQL Server 2012

我有一张表,其中包含计算机和安装的软件。现在,一台计算机可以安装 30 多个软件,但基础架构上可能有 100 多个不同的软件。

这是表格的表示

Computer  | Software
--------------------
PC123     | Office
PC123     | Firefox
PC456     | Office
PC456     | Firefox
PC456     | CAD
PC789     | Firefox
PC789     | Outlook
...

我正在寻找一个看起来像这样的结果

Computer  | Software 1 | Software 2 | Software 3 
------------------------------------------------
PC123     | Firefox    | Office     | NULL
PC456     | CAD        | Firefox    | Office
PC789     | Firefox    | Outlook    | NULL
...

我一直在研究动态 PIVOT,但我还是 SQL 新手。

感谢您的帮助

4

2 回答 2

1

这里有无数动态枢轴的例子,但是,我知道有时我们都需要一点点的启动。

例子

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(concat('Software ',Row_Number() over (Partition By Computer Order By Software))) From Yourtable  Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = '
Select [Computer],' + @SQL + '
From (
       Select Computer
             ,Software
             ,Col      = concat(''Software '',Row_Number() over (Partition By Computer Order By Software))
       From YourTable
     ) A
Pivot (max([software]) For [Col] in (' + @SQL + ') ) p'
Exec(@SQL);

退货

Computer    Software 1  Software 2  Software 3
PC123       Firefox     Office      NULL
PC456       CAD         Firefox     Office
PC789       Firefox     Outlook     NULL

如果有帮助,生成的 SQL 如下所示:

Select [Computer],[Software 1],[Software 2],[Software 3]
From (
       Select Computer
             ,Software
             ,Col      = concat('Software ',Row_Number() over (Partition By Computer Order By Software))
       From YourTable
     ) A
Pivot (max([software]) For [Col] in ([Software 1],[Software 2],[Software 3]) ) p
于 2017-03-30T15:56:26.723 回答
0

另一种选择是使用 stuff 功能并将所有软件放在一行中。我的代码可能略有偏差。我很烂,无法测试。

Results should look like this:
Computer    Software
PC123       Firefox, CAD, Office        
PC456       Firefox


SELECT t.Computer, Software_String.Software
FROM (SELECT DISTINCT Computer FROM TABLE) t
OUTER APPLY (
SELECT REPLACE(STUFF((
            SELECT ', ' + w.Start_Date, 100) 
            FROM Computer w
            WHERE c.Computer_ID = w.Computer_ID
            FOR XML PATH('')
            ), 1, 2, ''), '  ', ' ') [Software]
        ) Software_String

或者,您可以使用 case 语句代替枢轴。我发现枢轴编程很慢而且写起来很痛苦。

于 2017-03-30T16:12:51.360 回答