2016-09-28 147 views
-1

好所以我提出了前一天關於一個樞紐和主持人只是指出我的另一個問題,這不是答案,但我在另一個網站上找到我自己的。這與相同的SQL有關,但我需要做一個雙重支點。雙數據透視。沒有聚合然後聚合

這是我的代碼

CREATE TABLE #tempBene 
(accountID varchar(8), 
beneName1 varchar(30), 
beneamount1 decimal(12,0) 
) 


INSERT INTO #tempBene 
(accountID, beneName, beneamount) 
VALUES 
('1', 'One', 1), 
('1', 'OneTwo', 1), 
('1', 'OneThree', 1), 
('1', 'OneFour', 1), 
('1', 'OneFive', 1), 
('1', 'OneSix', 1), 

('2', 'TwoOne', 2), 
('2', 'TwoTwo', 2), 
('2', 'TwoThree', 2), 

('3', 'ThreeOne', 3), 
('3', 'ThreeTwo', 3), 
('3', 'ThreeThree', 3), 

('4', 'FourOne', 4), 
('4', 'FourTwo', 4), 

('5', 'FiveOne', 5) 

SELECT ACCOUNTID, [1] as BENE1, [2] as Bene2, [3] as Bene3, [4] as Bene4, [5] as Bene5 
    INTO #TempBene 
    FROM 
    (SELECT ACCOUNTID, BeneficiaryName 
    ROW_NUMBER() OVER (PARTITION BY AccountID ORDER BY ACCOUNTID) 
    AS ROWNUM 
    FROM #TempAccount 
    WHERE DELETEFLAG = 'N') a 
    PIVOT (MAX(BENEFICIARYName) FOR RowNUM IN ([1], [2], [3], [4], [5])) AS pvt 

上面的第一個支點得到總四周,給我什麼,我需要什麼部分。

我得到

ACCOUNTID Bene1 BENE2  BENE3  BENE4  BENE5 
1   one  onetwo 
2   twoone twotwo  twothree twofour twofive 

我需要什麼,我無法弄清楚是如何包括與量,因爲我沒有做一個彙總。

我需要

AccountID  Bene1  BeneAmt1  Bene2  BeneAmount2 ... 
1    one  1   onetwo 1 
2    onetwo  2   twotwo 2  

很抱歉,如果這是簡單一些,但我n要能在我的金額與每個記錄去維護我的樞補充。

謝謝

+0

這是一個有點難以跟隨你,因爲你給了我們的測試數據,但引用其他臨時表,並使它看起來像我們沒有反映出實際的模式示例數據。就像你給我們的問題的後半部分從第一個轉變爲第二個轉變。但幾乎在任何時候你需要不止一次地轉換你不應該使用PIVOT,而應該使用條件聚合。 – Matt

回答

0

您可以通過不使用PIVOT,但使用條件聚合。

select a.accountID, 
     MAX(CASE WHEN rowNum = 1 THEN beneName END) AS Bene1, 
     SUM(CASE WHEN rowNum = 1 THEN beneAmount END) AS BeneAmt1, 
     MAX(CASE WHEN rowNum = 2 THEN beneName END) AS Bene2, 
     SUM(CASE WHEN rowNum = 2 THEN beneAmount END) AS BeneAmt2, 
     MAX(CASE WHEN rowNum = 3 THEN beneName END) AS Bene3, 
     SUM(CASE WHEN rowNum = 3 THEN beneAmount END) AS BeneAmt3, 
     MAX(CASE WHEN rowNum = 4 THEN beneName END) AS Bene4, 
     SUM(CASE WHEN rowNum = 4 THEN beneAmount END) AS BeneAmt4, 
     MAX(CASE WHEN rowNum = 5 THEN beneName END) AS Bene5, 
     SUM(CASE WHEN rowNum = 5 THEN beneAmount END) AS BeneAmt5, 
     MAX(CASE WHEN rowNum = 6 THEN beneName END) AS Bene6, 
     SUM(CASE WHEN rowNum = 6 THEN beneAmount END) AS BeneAmt6 
FROM (
      SELECT *, 
        ROW_NUMBER() OVER (PARTITION BY accountID ORDER BY accountID) AS rowNum 
      FROM #tempBene 
     ) a 
GROUP BY a.accountID 
+0

謝謝。我被鎖定在樞軸中,並沒有在那個盒子外面思考。這按預期工作 – 10thTiger