2016-09-01 44 views
1

我可以找到的關於數據透視表的所有示例都涉及聚合,並且看起來太複雜以至於無法實現我正在嘗試執行的操作,這看起來應該非常簡單:將現有表與固定數量的行,並將數據呈現在列中而不是行格式。真正簡單的PIVOT示例MS SQL 2014

下面是一些神話般的數據:

DECLARE @HSData TABLE (

     School   NVARCHAR(20) 
    , Sophomores  INTEGER 
    , Juniors   INTEGER 
    , Seniors   INTEGER 
    , Total    INTEGER 
    ) 

INSERT INTO @HSData VALUES 
     ('Armstrong HS',397,337,318,0) 
    , ('Buchanan HS',383,325,308,0) 
    , ('Carlsbad HS',338,321,285,0) 

UPDATE @HSData 
    SET Total = Sophomores + Juniors + Seniors 

SELECT * FROM @HSData 

結果如下:

enter image description here

我要的是數據,看起來像這樣:

enter image description here

我可以實現這個b y使用此代碼手動將數據插入到變量中:

DECLARE 
      @AName   NVARCHAR(20) 
     , @BName   NVARCHAR(20) 
     , @CName   NVARCHAR(20) 
     , @A10    INTEGER 
     , @A11    INTEGER 
     , @A12    INTEGER 
     , @B10    INTEGER 
     , @B11    INTEGER 
     , @B12    INTEGER 
     , @C10    INTEGER 
     , @C11    INTEGER 
     , @C12    INTEGER 

SET @AName = (SELECT School FROM (SELECT School, ROW_NUMBER() OVER (ORDER BY School) RN FROM @HSData) SR WHERE RN = 1) 
SET @BName = (SELECT School FROM (SELECT School, ROW_NUMBER() OVER (ORDER BY School) RN FROM @HSData) SR WHERE RN = 2) 
SET @CName = (SELECT School FROM (SELECT School, ROW_NUMBER() OVER (ORDER BY School) RN FROM @HSData) SR WHERE RN = 3) 
SET @A10 = (SELECT Sophomores FROM @HSData WHERE School = @AName) 
SET @B10 = (SELECT Sophomores FROM @HSData WHERE School = @BName) 
SET @C10 = (SELECT Sophomores FROM @HSData WHERE School = @CName) 
SET @A11 = (SELECT Juniors FROM @HSData WHERE School = @AName) 
SET @B11 = (SELECT Juniors FROM @HSData WHERE School = @BName) 
SET @C11 = (SELECT Juniors FROM @HSData WHERE School = @CName) 
SET @A12 = (SELECT Seniors FROM @HSData WHERE School = @AName) 
SET @B12 = (SELECT Seniors FROM @HSData WHERE School = @BName) 
SET @C12 = (SELECT Seniors FROM @HSData WHERE School = @CName) 

    DECLARE @HSData2 TABLE (

      Class     NVARCHAR(20) 
     , "Armstrong HS"  INTEGER 
     , "Buchanan HS"   INTEGER 
     , "Carlsbad HS"   INTEGER 
     ) 

INSERT INTO @HSData2 VALUES 
      ('Sophomores',@A10,@B10,@C10) 
     , ('Juniors', @A11,@B11,@C11) 
     , ('Seniors', @A12,@B12,@C12) 
     , ('Total',  @[email protected][email protected],@[email protected][email protected],@[email protected][email protected]) 

SELECT * FROM @HSData2 

但似乎應該有更好的方法。

理想情況下,我可以將這一切歸入SSRS報告中,然後不用擔心。但它仍然讓我感到有點奇怪,我找不到任何簡單的代碼。

回答

1

重新旋轉數據,然後旋轉。

SELECT * 
FROM @HSData 
UNPIVOT (
    Students 
    FOR Class IN (Sophomores, Juniors, Seniors, Total) 
) up 
PIVOT (
    SUM(Students) 
    FOR School IN ([Armstrong HS], [Buchanan HS], [Carlsbad HS]) 
) p 
ORDER BY CASE Class WHEN 'Sophomores' THEN 1 
        WHEN 'Juniors' THEN 2 
        WHEN 'Seniors' THEN 3 
        WHEN 'Total' THEN 4 END 
+0

哇,只是哇。謝謝。太精彩了。 – DaveX

1

,我認爲這將是UNPIVOT數據更容易,讓MATRIX在SSRS擔心把它重新走到一起就像你想要的。

SELECT U.SCHOOL, U.CLASS, U.TOTALS 
FROM TABLE1 S 
UNPIVOT 
(
    TOTALS 
    FOR CLASS IN (SOPHMORES, JUNIORS, SENIORS) 
) U; 

對於矩陣,有行集團通過類和列小組通過學校

你也可以將通過學校並使用相同的數據集團通過行集團另一個矩陣。