2016-08-31 18 views
0

我正在努力與sql服務器,我想樞軸一列和unpivot三列。我沒有找到任何東西來聚合。SQL Server支持一列並且不透明三列。

我有數據格式爲:

UnAssigned | Assigned | InProgress | NotStarted | Date   | Type 
---------------------------------------------------------------------------- 
31-08-2016 | NULL  | NULL  | NULL  | September2015 | ABC 
NULL  | 28-08-2016 | NULL  | NULL  | August2015  | XYZ 
NULL  | NULL  | 05-08-2016 | NULL  | JULY2015  | XYZ 
NULL  | 28-08-2016 | NULL  | NULL  | August2015  | ABC 
NULL  | NULL  | 05-08-2016 | NULL  | JULY2015  | ABC 

我需要按此格式輸出:

ABC   | September2015 | August2015 | JULY2015 
----------------------------------------------------- 
UnAssigned |  1  |  0  |  0 
Assigned  |  0  |  1  |  0 
InProgress |  0  |  0  |  1 
NotStarted |  0  |  0  |  0 

XYZ   | September2015 | August2015 | JULY2015 
----------------------------------------------------- 
UnAssigned |  1  |  0  |  0 
Assigned  |  0  |  1  |  0 
InProgress |  0  |  0  |  1 
NotStarted |  0  |  0  |  0 

回答

0

這不是真正的SQL的能力產生相當報告中,對於您可能會更好使用excel或某種報告工具,如SSRS。 說了這麼多,你可以得到接近使用這種方法: -

DECLARE @T TABLE (UnAssigned VARCHAR(10), Assigned VARCHAR(10), InProgress VARCHAR(10) , NotStarted VARCHAR(10), Dt VARCHAR(20), Type VARCHAR(3)) 

    INSERT INTO @T VALUES 
    ('31-08-2016' , NULL  , NULL  , NULL  , 'September2015' , 'ABC'), 
    (NULL  , '28-08-2016' , NULL  , NULL  , 'August2015'  , 'XYZ'), 
    (NULL  , NULL  , '05-08-2016' , NULL  , 'JULY2015'  , 'XYZ'), 
    (NULL  , '28-08-2016' , NULL  , NULL  , 'August2015'  , 'ABC'), 
    (NULL   , NULL , '28-08-2016' , NULL  , 'JULY2015'  , 'ABC') 


    SELECT dummytype type1,SRC, 
      ISNULL([September2015],0) SEPTEMBER2015,ISNULL([August2015],0) AUGUST2015,ISNULL([JULY2015],0) JULY2015 

    FROM 
    (
    SELECT 'Unassigned' SRC,TYPE,type as dummytype,DT,CASE WHEN UNASSIGNED IS NOT NULL THEN 1 ELSE 0 END obs FROM @T 
    UNION 
    SELECT 'Assigned' ,TYPE,'',DT,CASE WHEN ASSIGNED IS NOT NULL THEN 1 ELSE 0 END ASSIGNED FROM @T 
    UNION 
    SELECT 'Inprogress',TYPE,'',DT,CASE WHEN INPROGRESS IS NOT NULL THEN 1 ELSE 0 END INPROGRESS FROM @T 
    UNION 
    SELECT 'Notstarted' ,TYPE,'',DT,CASE WHEN NOTSTARTED IS NOT NULL THEN 1 ELSE 0 END NOTSTARTED FROM @T 
    ) s 
    pivot (sum(obs) for dt in ([JULY2015],[August2015],[September2015])) pvt 

ORDER BY TYPE, 
    CASE WHEN left(SRC,1) = 'U' THEN 1 
     WHEN left(SRC,1) = 'A' THEN 2 
     WHEN left(SRC,1) = 'I' THEN 3 
     WHEN left(SRC,1) = 'N' THEN 4 
    END 

結果

type1 SRC  SEPTEMBER2015 AUGUST2015 JULY2015 
----- ---------- ------------- ----------- ----------- 
ABC Unassigned    1   0   0 
     Assigned    0   1   0 
     Inprogress    0   0   1 
     Notstarted    0   0   0 
XYZ Unassigned    0   0   0 
     Assigned    0   1   0 
     Inprogress    0   0   1 
     Notstarted    0   0   0 
0

可以逆轉置,然後轉動數據..只是使用COUNT()爲您彙總在數據透視

DECLARE @tmpTable table 
    ([UnAssigned] DATETIME, [Assigned] DATETIME, [InProgress] DATETIME, [NotStarted] DATETIME, [Date] varchar(13), [Type] varchar(3)) 
; 
INSERT INTO @tmpTable 
    ([UnAssigned], [Assigned], [InProgress], [NotStarted], [Date], [Type]) 
VALUES 
    ('2016-08-31', NULL, NULL, NULL, 'September2015', 'ABC'), 
    (NULL, '2016-08-28', NULL, NULL, 'August2015', 'XYZ'), 
    (NULL, NULL, '2016-08-05', NULL, 'JULY2015', 'XYZ'), 
    (NULL, '2016-08-28', NULL, NULL, 'August2015', 'ABC'), 
    (NULL, NULL, '2016-08-05', NULL, 'JULY2015', 'ABC') 
; 


WITH Sources AS (
    SELECT Type, Src, Ord 
    FROM (SELECT DISTINCT Type FROM @tmpTable) t 
      CROSS JOIN (VALUES (1, 'UnAssigned'), (2, 'Assigned'), (3, 'InProgress'), (4, 'NotStarted')) ca(Ord, Src) 
) 
SELECT s.Type, 
     s.Src, 
     September2015 = ISNULL(September2015, 0), 
     August2015  = ISNULL(August2015, 0), 
     JULY2015  = ISNULL(JULY2015, 0) 
FROM @tmpTable t 
     UNPIVOT (StatusDate FOR Status IN (UnAssigned,Assigned,InProgress,NotStarted)) up 
     PIVOT (COUNT(Date) FOR Date IN (September2015,August2015,JULY2015)) p 
     FULL OUTER JOIN Sources s ON s.Type = p.Type AND s.Src = p.Status 
ORDER BY s.Type, 
     s.Ord