簡體   English   中英

具有兩個交替列的TSQL Dynamic Pivot

[英]TSQL Dynamic Pivot with two alternating columns

我有一個表格,該表格在多個日期向客戶多次付款,如下所示:

Claimid  Payorder   Date Raised  Amount
79         1        05/12/2013   120000.00
79         2        19/10/2013   1138873.90
79         3        29/10/2013   150000.00
79         4        30/10/2013   11126.10
678        1        09/02/2006   467207.65

我需要透視數據,使其看起來像這樣:

[Claimid]  [Date_Raised_1] [Payment_1]  [Date_Raised_2]  [Payment_2]
 79        05/12/2013        120000      19/10/2013       1138873.9

誰能幫我這個? -它也必須是動態的,因為任何索賠都可以有很多付款。

這就是我想出的:

CREATE TABLE #Sample
(
    ClaimId INT
    , PayOrder INT
    , DateRaised DATE
    , Amount FLOAT
);

DECLARE @SQL VARCHAR(MAX) = 'SELECT ClaimId';

INSERT INTO #Sample (ClaimId, PayOrder, DateRaised, Amount)
VALUES (79, 1, CONVERT(DATE, '05/12/2013', 103), 120000.00)
    , (79, 2, CONVERT(DATE, '19/10/2013', 103), 1138873.90)
    , (79, 3, CONVERT(DATE, '29/10/2013', 103), 150000.00)
    , (79, 4, CONVERT(DATE, '30/10/2013', 103), 11126.10)
    , (678, 1, CONVERT(DATE, '09/02/2006', 103), 467207.65);

SELECT @SQL += '
    , MAX(CASE WHEN PayOrder = ' + PayOrder + ' THEN DateRaised END) AS [DateRaised_' + PayOrder + ']
    , MAX(CASE WHEN PayOrder = ' + PayOrder + ' THEN Amount END) AS [Payment_' + PayOrder + ']'
FROM (SELECT DISTINCT CONVERT(VARCHAR, PayOrder) AS PayOrder FROM #Sample) AS T
ORDER BY T.PayOrder;

SET @SQL += 'FROM #Sample GROUP BY ClaimId;';

EXECUTE (@SQL);

DROP TABLE #Sample;

該查詢將為每個DISTINCT PayOrder生成列,並在您的測試用例中生成以下查詢:

SELECT ClaimId
    , MAX(CASE WHEN PayOrder = 1 THEN DateRaised END) AS [DateRaised_1]
    , MAX(CASE WHEN PayOrder = 1 THEN Amount END) AS [Payment_1]
    , MAX(CASE WHEN PayOrder = 2 THEN DateRaised END) AS [DateRaised_2]
    , MAX(CASE WHEN PayOrder = 2 THEN Amount END) AS [Payment_2]
    , MAX(CASE WHEN PayOrder = 3 THEN DateRaised END) AS [DateRaised_3]
    , MAX(CASE WHEN PayOrder = 3 THEN Amount END) AS [Payment_3]
    , MAX(CASE WHEN PayOrder = 4 THEN DateRaised END) AS [DateRaised_4]
    , MAX(CASE WHEN PayOrder = 4 THEN Amount END) AS [Payment_4]
FROM #Sample
GROUP BY ClaimId;

那是輸出:

╔═════════╦══════════════╦═══════════╦══════════════╦═══════════╦══════════════╦═══════════╦══════════════╦═══════════╗
║ ClaimId ║ DateRaised_1 ║ Payment_1 ║ DateRaised_2 ║ Payment_2 ║ DateRaised_3 ║ Payment_3 ║ DateRaised_4 ║ Payment_4 ║
╠═════════╬══════════════╬═══════════╬══════════════╬═══════════╬══════════════╬═══════════╬══════════════╬═══════════╣
║      79 ║ 2013-12-05   ║ 120000    ║ 2013-10-19   ║ 1138873.9 ║ 2013-10-29   ║ 150000    ║ 2013-10-30   ║ 11126.1   ║
║     678 ║ 2006-02-09   ║ 467207.65 ║ NULL         ║ NULL      ║ NULL         ║ NULL      ║ NULL         ║ NULL      ║
╚═════════╩══════════════╩═══════════╩══════════════╩═══════════╩══════════════╩═══════════╩══════════════╩═══════════╝

忽略日期格式,將地雷設置為YYYY-MM-DD 它應該在您的計算機上顯示為DD/MM/YYYY

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM