数据库: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新手。
感谢您的帮助
答案 0 :(得分: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
答案 1 :(得分: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
或者您可以使用案例陈述而不是枢轴。我觉得枢轴编程很慢,写起来很痛苦。