Сверните несколько строк в один - PullRequest
0 голосов
/ 05 мая 2020

У меня есть следующий результат, когда я запрашиваю несколько таблиц / представлений и помещаю результат в #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) имеет значение.

Я сделал что-то похожее, но исходные данные намного проще (код ниже). Поэтому первое, что я сделал, - это основал его на запросе ниже, но он возвращает неверные данные. Затем я попробовал это с помощью Pivot, stuff / XML 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

1 Ответ

0 голосов
/ 05 мая 2020

Следующее может помочь вам:

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 здесь .

...