将多行卷成一行

问题描述 投票:0回答:1

当我查询多个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
sql sql-server sql-server-2014
1个回答
0
投票

以下内容可能会对你有所帮助。

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。此处.

© www.soinside.com 2019 - 2024. All rights reserved.