当我查询多个tabelsviews并将结果放在#Temp中时,我有以下结果(我使用MS SQL SERVER 2014)。
问题是,我无法在每个组织的1行中获得所有相关数据。对于每一个 "额外 "的值,我都会得到一个新的行,所以你会得到多行,从而得到一个未分类的结果。
Rows |OrgNumb|OrgNam |ProdNam| ValDec |AttrC | AttrV |
1 | 115 | Org1 | Acc | 1.00 | Number | 09133444 |
2 | 115 | Org1 | Acc | 1.00 | SBI | 1089 |
3 | 115 | Org1 | Fac | 1.00 | Number | 09133444 |
4 | 115 | Org1 | Fac | 1.00 | SBI | 1089 |
5 | 115 | Org1 | Rel | 1.00 | Number | 09133444 |
6 | 115 | Org1 | Rel | 1.00 | SBI | 1089 |
7 | 119 | Org2 | Ord | 1.00 | Number | 05558794 |
8 | 119 | Org2 | Ord | 1.00 | SBI | 1089 |
我需要得到这个结果。
Rows |OrgNum |OrgNam|ProdN1|ValDec1|ProdN2|ValDec2|ProdN3|ValDec3|AttrC1 |AttrV1 |AttrC2 |AttrV2|
1 | 115 | Org1 | Acc | 1.00 | Fac | 1.00 | Rel | 1.00 |Number | 09133444 | SBI | 1089 |
2 | 119 | Org1 | Ord | 1.00 | | | | |Number | 05558794 | SBI | 1089 |
还有更多的列,但这些都是目前最重要的,而且与这个例子不同的是,并不是每个属性(AttrC1)都有一个值。
我做了一个有类似目的的东西,但sourceedata更简单(代码如下)。所以我做的第一件事就是基于下面的查询,但它返回的数据是错误的。然后我用Pivot,stuffXML PATH试了一下,但都没有给我正确的结果。我看了@ countles 的例子,但他们都不能帮助我。
SELECT Period, Debitor,
MAX( CASE WHEN RN = 1 THEN Product ELSE NULL END ) AS Product1,
SUM( CASE WHEN RN = 1 THEN Amount ELSE NULL END ) AS Amount1,
MAX( CASE WHEN RN = 2 THEN Product ELSE NULL END ) AS Product2,
---- and so on
SUM( CASE WHEN RN = 14 THEN Amount ELSE NULL END ) AS Amount14,
SUM( price * Amount ) AS [Net price]
FROM (
SELECT ROW_NUMBER() OVER ( PARTITION BY Debitor, Debitor ORDER BY Period ) AS RN, *
FROM #TempVF
) AS RI
GROUP BY Period, Debitor
以下内容可能会对你有所帮助。
DECLARE @cols AS VARCHAR(MAX), @query AS VARCHAR(MAX);
SET @cols = STUFF((select distinct ',
MAX(CASE WHEN ProdNam=''' + CAST(ProdNam as varchar(100)) + ''' THEN ProdNam ELSE '''' END) AS [ProdN' + CAST(sno as varchar(10)) +']
,MAX(CASE WHEN ValDec=''' + CAST(ValDec as varchar(100)) + ''' THEN ValDec ELSE '''' END) AS [ValDec' + CAST(sno as varchar(10)) +']
,MAX(CASE WHEN AttrC=''' + CAST(AttrC as varchar(100)) + ''' THEN AttrC ELSE '''' END) AS [AttrC' + CAST(sno as varchar(10)) +']
,MAX(CASE WHEN AttrV=''' + CAST(AttrV as varchar(100)) + ''' THEN AttrV ELSE '''' END) AS [AttrV' + CAST(sno as varchar(10)) +']'
/*---------------------------------you can add other columns similar to the above here----------------------------------*/
FROM #t
FOR XML PATH(''),type).value('.','varchar(max)'),1,2,'')
exec ('SELECT 1 '' '', OrgNumb, OrgNam, ' + @Cols +' FROM #t group by OrgNumb, OrgNam')
请找到db<>fiddle。此处.