Wenn es Ihnen nichts ausmacht, dynamisch zu gehen. Dieser Ansatz erfordert eine Hilfsfunktion, um Ihre Daten in eine EAV-Struktur (Entity Attribute Value) zu konvertieren.
Declare @YourTable table (PR int,Inv int,Comm int,Comm1 int,Comm2 int)
Insert Into @YourTable values
(123,1,10, 0, 1),
(234,1,20, 5, 10),
(345,1,40,16, 21),
(098,2,23,65, 76),
(765,2,45,32, 0),
(981,1,65,87, 9),
(981,2,45,32,100)
Select PR=Entity
,Inv
,Col = Concat(B.Attribute,'_',Inv)
,B.Value
Into #Temp
From @YourTable A
Cross Apply (Select * from [dbo].[udf-EAV]((Select A.* for XML RAW)) Where Attribute<>'Inv') B
Declare @SQL varchar(max) = ''
Select @SQL = @SQL+','+QUOTENAME(Col)+'=max(IIF(Col='''+col+''',Value,0))' From (Select Top 100 Percent Inv,Col from #Temp Group By Inv,Col Order by Inv) A
Exec('Select PR'[email protected]+' From #Temp Group By PR Order By Pr')
Returns
UDF
CREATE FUNCTION [dbo].[udf-EAV](@XML xml)
Returns Table
As
Return (
with cteKey(k) as (Select Top 1 xAtt.value('local-name(.)','varchar(100)') From @XML.nodes('/row') As A(xRow) Cross Apply A.xRow.nodes('./@*') As B(xAtt))
Select Entity = xRow.value('@*[1]','varchar(50)')
,Attribute = xAtt.value('local-name(.)','varchar(100)')
,Value = xAtt.value('.','varchar(max)')
From @XML.nodes('/row') As A(xRow)
Cross Apply A.xRow.nodes('./@*') As B(xAtt)
Where xAtt.value('local-name(.)','varchar(100)') Not In (Select k From cteKey)
)
/*
-- Notes: First Field in Query will be the Entity
Welches DBMS verwenden Sie genau? Das Verfahren zum Erfüllen der obigen Aufgabe ist in jedem Fall unterschiedlich. Nicht möglich für alles in einem zu beantworten. – Susang
sql server 2014 – chanti
Sie können PIVOT in SQL-Server verwenden und ich denke, Sie können es mithilfe von Web tun, also bitte versuchen Sie es einmal. https://msdn.microsoft.com/en-us/library/ms177410.aspx Ich denke, dass Sie Ihre Anforderung zuerst überprüfen müssen, weil es nicht genau ist, was getan werden kann. – Susang