2016-11-29 33 views
4

SQL數據透視表我怎麼能轉換這個查詢樞從查詢

select 
branch, 
months, 
[Parts Revenue Budget] 
from #Temp1 

結果
enter image description here

所需的輸出
enter image description here

回答

2
SELECT BRANCH, 
    SUM(CASE WHEN MONTHS = 'JAN' THEN PARTSREVENUEBUDJET END) AS [JAN], 
    SUM(CASE WHEN MONTHS = 'FEB' THEN PARTSREVENUEBUDJET END) AS [FEB], 
    SUM(CASE WHEN MONTHS = 'MAR' THEN PARTSREVENUEBUDJET END) AS [MARCH], 
    SUM(CASE WHEN MONTHS = 'APR' THEN PARTSREVENUEBUDJET END) AS [APR], 
    SUM(CASE WHEN PONITS = 'MAY' THEN PARTSREVENUEBUDJET END) AS [MAY], 
    SUM(CASE WHEN MONTHS = 'JUNE' THEN PARTSREVENUEBUDJET END) AS [JUNE], 
    SUM(CASE WHEN MONTHS = 'JULY' THEN PARTSREVENUEBUDJET END) AS [JULY], 
    SUM(CASE WHEN MONTHS = 'AUG' THEN PARTSREVENUEBUDJET END) AS [AUG], 
    SUM(CASE WHEN MONTHS = 'SEP' THEN PARTSREVENUEBUDJET END) AS [SEP], 
    SUM(CASE WHEN MONTHS = 'OCT' THEN PARTSREVENUEBUDJET END) AS [OCT], 
    SUM(CASE WHEN MONTHS = 'NOV' THEN PARTSREVENUEBUDJET END) AS [NOV], 
    SUM(CASE WHEN MONTHS = 'NOV' THEN PARTSREVENUEBUDJET END) AS [DEC], 
      SUM(PARTSREVENUEBUDJET) AS 'GRANDTOTAL' 
    FROM TABLE 
    GROUP BY BRANCH 

2)

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(months) 
        from #TEMP1 
        group by months 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT branch,' + @cols + ',tiot from 
      (
       select *,sum(BUDGET)over(partition by branch) as tiot 
       from #TEMP1 
      ) x 
      pivot 
      (
       sum(BUDGET) 
       for months in (' + @cols + ') 
      ) p ' 

exec(@query); 
+0

我必須明確添加所有月份以這種方式,有什麼方法嗎? –

+0

是的,你可以使用動態數據透視查詢.. @ SanyaZahid – Chanukya

+0

那麼「總計」行呢? – sagi

2

可以使用條件彙總:

SELECT t.branch, 
     SUM(CASE WHEN t.months = 'JAN' THEN t.[Parts Revenue Budget] ELSE 0 END) as JAN, 
     SUM(CASE WHEN t.months = 'FEB,' THEN t.[Parts Revenue Budget] ELSE 0 END) as FEB 
     ... As many as you need 
     SUM(t.[Parts Revenue Budget]) as grandtotal 
FROM #Temp1 
GROUP BY t.branch 
UNION ALL 
SELECT 'Grand Total', 
     SUM(CASE WHEN t.months = 'JAN' THEN t.[Parts Revenue Budget] ELSE 0 END) as JAN, 
     SUM(CASE WHEN t.months = 'FEB' THEN t.[Parts Revenue Budget] ELSE 0 END) as FEB, 
     ... As many as you need 
     SUM(t.[Parts Revenue Budget]) as grandtotal 
FROM #Temp1 t 
0

我試過如下:

CREATE TABLE #TEMP1(BRANCH VARCHAR(100),MONTHS VARCHAR(100),BUDGET varchar(100)) 

INSERT INTO #TEMP1 VALUES ('CPD','APR','801375') 
INSERT INTO #TEMP1 VALUES ('Sabzi Mandi','APR','1033697') 
INSERT INTO #TEMP1 VALUES ('DHA','APR','2119835') 
INSERT INTO #TEMP1 VALUES ('Quidabad','APR','2100042') 
INSERT INTO #TEMP1 VALUES ('Sukkar','AUG','44377320') 
INSERT INTO #TEMP1 VALUES ('Baghbanpura','AUG','2726114') 
INSERT INTO #TEMP1 VALUES ('Multan','AUG','6068565') 


select *,coalesce(CAST(AUG AS NUMERIC(10,2)),0)+coalesce(CAST(apr AS NUMERIC(10,2)),0) as 'grand total' 
from 
(select branch , months ,budget from #temp1) as s 
pivot 
(MAX(BUDGET) for months in (APR,AUG)) AS PVT 
0
CREATE TABLE TEMP1(BRANCH VARCHAR(100),MONTHS VARCHAR(100),BUDGET FLOAT(126)); 

INSERT INTO TEMP1 VALUES ('ABC','AUG','1000'); 
INSERT INTO TEMP1 VALUES ('PQR','APR','2000'); 
INSERT INTO TEMP1 VALUES ('XYZ','AUG','1000'); 



SELECT 
    BRANCH, 
    APR, 
    AUG, 
    (NVL(APR,'0')+NVL(AUG,'0')) AS GRANDTOTAL 
    FROM 
    (SELECT 
    * 
    FROM 
     (
     SELECT 
      BRANCH, 
      MONTHS, 
      BUDGET 
     FROM 
      TEMP1 
    ) 
     pivot (MIN(BUDGET) FOR MONTHS IN ('APR' AS APR,'AUG' AS AUG))) 
     UNION ALL 
     SELECT 'GRAND TOTAL' AS BRANCH,SUM(APR) AS APR, SUM(AUG) AS AUG, SUM(GRANDTOTAL) AS GRANDTOTAL 
     FROM 
     (SELECT 
    BRANCH, 
    APR, 
    AUG, 
    (NVL(APR,'0')+NVL(AUG,'0')) AS GRANDTOTAL 
    FROM 
    (SELECT 
    * 
    FROM 
     (
     SELECT 
      BRANCH, 
      MONTHS, 
      BUDGET 
     FROM 
      TEMP1 
    ) 
     pivot (MIN(BUDGET) FOR MONTHS IN ('APR' AS APR,'AUG' AS AUG)))); 
+0

你好@Sanya Zahid你也可以試試以上查詢。 – Singh