2017-02-15 59 views
0

我已經爲此苦苦了好幾個小時,並決定尋求幫助。我只做了另一個支點,它比這更簡單。爲什麼我的pivoted SQL返回所有NULL值?

我想要做的是連接來自兩個表的事件數據 - 事件和數據源,並總結自2014年1月以來的數據。由於我們差不多到2017年第一季度的一半,那將是13列。

我的SQL確實編譯,但它爲每列返回NULL。

這裏是我的SQL:

SELECT [ClientName], 
     [1] AS [2014 - Q1], 
     [2] AS [2014 - Q2], 
     [3] AS [2014 - Q3], 
     [4] AS [2014 - Q4], 
     [5] AS [2015 - Q1], 
     [6] AS [2015 - Q2], 
     [7] AS [2015 - Q3], 
     [8] AS [2015 - Q4], 
     [9] AS [2016 - Q1], 
     [10] AS [2016 - Q2], 
     [11] AS [2016 - Q3], 
     [12] AS [2016 - Q4], 
     [13] AS [2017 - Q1] 
FROM(
SELECT COALESCE(S.S_Name,'') AS [ClientName], 
     (CAST(DATEPART(YEAR,I.opened) AS VARCHAR(4)) + CAST(DATEPART(QUARTER,I.opened) AS VARCHAR(1))) AS [Period], 
     COUNT(I.incidentno) AS [IncidentCount] 
FROM incident I 
LEFT OUTER JOIN source S ON I.SourceId = S.S_ID 
WHERE S.S_ID = 'OP_Pac_ANZ' 
GROUP BY COALESCE(S.S_Name,''), (CAST(DATEPART(YEAR,I.opened) AS VARCHAR(4)) + CAST(DATEPART(QUARTER,I.opened) AS VARCHAR(1))) 
) 
src 
PIVOT (SUM(src.IncidentCount) 
FOR [Period] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13])) AS pvt 

這些是實際結果:

CLIENTNAME 2014 - 2014年第一季度 - Q2 2014 - Q3 2014 - Q4 2015年 - Q1 2015年 - 2015年第二季度 - 第三季度2015年 - Q4 2016 - Q1 2016 - Q2 2016 - Q3 2016 - 2017年第四季度 - Q1 ANZ NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

這些都是預期的結果:

客戶名稱2014 - 2014年第1季度 - 2014年第2季度 - 2014年第3季度 - 2015年第4季度 - 2015年第1季度 - 2015年第2季度 - 2015年第3季度 - 2016年第4季度 - 2016年第1季度 - 2016年第2季度 - 2016年第3季度 - 2017年第4季度 - 10 3 NULL 1 NULL NULL

接下來我將着手提供示例數據。

下面是修改SQL:

SELECT [ClientName], 
     ['20141'] AS [2014 - Q1], 
     ['20142'] AS [2014 - Q2], 
     ['20143'] AS [2014 - Q3], 
     ['20144'] AS [2014 - Q4], 
     ['20151'] AS [2015 - Q1], 
     ['20152'] AS [2015 - Q2], 
     ['20153'] AS [2015 - Q3], 
     ['20154'] AS [2015 - Q4], 
     ['20161'] AS [2016 - Q1], 
     ['20161'] AS [2016 - Q2], 
     ['20162'] AS [2016 - Q3], 
     ['20163'] AS [2016 - Q4], 
     ['20171'] AS [2017 - Q1] 
FROM(
SELECT COALESCE(S.S_Name,'') AS [ClientName], 
     (CAST(DATEPART(YEAR,I.opened) AS VARCHAR(4)) + CAST(DATEPART(QUARTER,I.opened) AS VARCHAR(1))) AS [Period], 
     COUNT(I.incidentno) AS [IncidentCount] 
FROM incident I 
LEFT OUTER JOIN source S ON I.SourceId = S.S_ID 
WHERE I.SourceId = 'OP_Pac_ANZ' 
GROUP BY COALESCE(S.S_Name,''), (CAST(DATEPART(YEAR,I.opened) AS VARCHAR(4)) + CAST(DATEPART(QUARTER,I.opened) AS VARCHAR(1))) 
) 
src 
PIVOT (SUM(src.IncidentCount) 
FOR [Period] IN (['20141'],['20142'],['20143'],['20144'],['20151'],['20152'],['20153'],['20154'],['20161'],['20162'],['20163'],['20164'],['20171'])) AS pvt 

下面是創建兩個表並插入數據的SQL。

CREATE TABLE incident 
(
incidentno nvarchar(255), 
sourceid nvarchar(255), 
opened datetime 
); 

CREATE TABLE source 
(
s_id nvarchar(255), 
S_name nvarchar(255) 
); 

INSERT INTO source VALUES 
('OP_Pac_ANZ', 'ANZ'); 

INSERT INTO incident 
(incidentno, sourceid, opened) 
VALUES 
('1506110002', 'OP_Pac_ANZ', '2015-06-11 02:36:00.000'), 
('1506110100', 'OP_Pac_ANZ', '2015-06-11 21:48:00.000'), 
('1506120010', 'OP_Pac_ANZ', '2015-06-12 03:00:00.000'), 
('1501260175', 'OP_Pac_ANZ', '2015-01-26 23:34:00.000'), 
('1501290278', 'OP_Pac_ANZ', '2015-01-29 19:40:00.000'), 
('1502110143', 'OP_Pac_ANZ', '2015-02-11 15:28:00.000'), 
('1501090237', 'OP_Pac_ANZ', '2015-01-09 16:52:00.000'), 
('1506150148', 'OP_Pac_ANZ', '2015-06-15 23:31:00.000'), 
('1506160142', 'OP_Pac_ANZ', '2015-06-16 23:19:00.000'), 
('1506170005', 'OP_Pac_ANZ', '2015-06-17 04:10:00.000'), 
('1506170113', 'OP_Pac_ANZ', '2015-06-17 20:53:00.000'), 
('1507010002', 'OP_Pac_ANZ', '2015-07-01 00:49:00.000'), 
('1507010006', 'OP_Pac_ANZ', '2015-07-01 03:36:00.000'), 
('1507010012', 'OP_Pac_ANZ', '2015-07-01 05:06:00.000'), 
('1507020104', 'OP_Pac_ANZ', '2015-07-02 22:21:00.000'), 
('1507030002', 'OP_Pac_ANZ', '2015-07-03 03:01:00.000'), 
('1507030003', 'OP_Pac_ANZ', '2015-07-03 03:11:00.000'), 
('1507080007', 'OP_Pac_ANZ', '2015-07-08 05:10:00.000'), 
('1507080039', 'OP_Pac_ANZ', '2015-07-08 11:11:00.000'), 
('1507080124', 'OP_Pac_ANZ', '2015-07-08 23:31:00.000'), 
('1507100003', 'OP_Pac_ANZ', '2015-07-10 01:39:00.000'), 
('1507120001', 'OP_Pac_ANZ', '2015-07-12 00:02:00.000'), 
('1503300232', 'OP_Pac_ANZ', '2015-03-30 21:37:00.000'), 
('1405280003', 'OP_Pac_ANZ', '2014-05-28 04:43:00.000'), 
('1405280325', 'OP_Pac_ANZ', '2014-05-28 22:22:00.000'), 
('1405290007', 'OP_Pac_ANZ', '2014-05-29 04:11:00.000'), 
('1405290009', 'OP_Pac_ANZ', '2014-05-29 04:23:00.000'), 
('1406030002', 'OP_Pac_ANZ', '2014-06-03 02:07:00.000'), 
('1405140050', 'OP_Pac_ANZ', '2014-05-14 08:47:00.000'), 
('1405140322', 'OP_Pac_ANZ', '2014-05-14 19:22:00.000'), 
('1405140327', 'OP_Pac_ANZ', '2014-05-14 19:42:00.000'), 
('1501120369', 'OP_Pac_ANZ', '2015-01-12 19:36:00.000'), 
('1504200174', 'OP_Pac_ANZ', '2015-04-20 23:42:00.000'), 
('1510080001', 'OP_Pac_ANZ', '2015-10-08 00:59:00.000'), 
('1510080128', 'OP_Pac_ANZ', '2015-10-08 16:39:00.000'), 
('1510120006', 'OP_Pac_ANZ', '2015-10-12 03:49:00.000'), 
('1510120111', 'OP_Pac_ANZ', '2015-10-12 22:32:00.000'), 
('1510120114', 'OP_Pac_ANZ', '2015-10-12 23:33:00.000'), 
('1510130002', 'OP_Pac_ANZ', '2015-10-13 03:35:00.000'), 
('1503040057', 'OP_Pac_ANZ', '2015-03-04 11:10:00.000'), 
('1503300005', 'OP_Pac_ANZ', '2015-03-30 02:39:00.000'), 
('1403110339', 'OP_Pac_ANZ', '2014-03-11 21:52:00.000'), 
('1406150021', 'OP_Pac_ANZ', '2014-06-15 21:18:00.000'), 
('1408130367', 'OP_Pac_ANZ', '2014-08-13 22:13:00.000'), 
('1506190003', 'OP_Pac_ANZ', '2015-06-19 00:18:00.000'), 
('1406290015', 'OP_Pac_ANZ', '2014-06-29 19:59:00.000'), 
('1406290016', 'OP_Pac_ANZ', '2014-06-29 20:03:00.000'), 
('1410120030', 'OP_Pac_ANZ', '2014-10-12 21:20:00.000'), 
('1408010001', 'OP_Pac_ANZ', '2014-08-01 03:13:00.000'), 
('1408030020', 'OP_Pac_ANZ', '2014-08-03 23:38:00.000'), 
('1408060301', 'OP_Pac_ANZ', '2014-08-06 22:08:00.000'), 
('1403180346', 'OP_Pac_ANZ', '2014-03-18 21:29:00.000'), 
('1405150357', 'OP_Pac_ANZ', '2014-05-15 22:42:00.000'), 
('1405180033', 'OP_Pac_ANZ', '2014-05-18 20:24:00.000'), 
('1405190025', 'OP_Pac_ANZ', '2014-05-19 07:31:00.000'), 
('1402170070', 'OP_Pac_ANZ', '2014-02-17 11:07:00.000'), 
('1407080003', 'OP_Pac_ANZ', '2014-07-08 03:27:00.000'), 
('1407130019', 'OP_Pac_ANZ', '2014-07-13 22:26:00.000'), 
('1408190333', 'OP_Pac_ANZ', '2014-08-19 21:18:00.000'), 
('1410150001', 'OP_Pac_ANZ', '2014-10-15 01:12:00.000'), 
('1402240330', 'OP_Pac_ANZ', '2014-02-24 18:40:00.000'), 
('1512210004', 'OP_Pac_ANZ', '2015-12-21 01:30:00.000'), 
('1512210005', 'OP_Pac_ANZ', '2015-12-21 01:36:00.000'), 
('1403310361', 'OP_Pac_ANZ', '2014-03-31 21:21:00.000'), 
('1403030003', 'OP_Pac_ANZ', '2014-03-03 02:46:00.000'), 
('1403030417', 'OP_Pac_ANZ', '2014-03-03 19:40:00.000'), 
('1410290005', 'OP_Pac_ANZ', '2014-10-29 00:38:00.000'), 
('1412220320', 'OP_Pac_ANZ', '2014-12-22 21:10:00.000'), 
('1506260012', 'OP_Pac_ANZ', '2015-06-26 03:50:00.000'), 
('1506290005', 'OP_Pac_ANZ', '2015-06-29 03:11:00.000'), 
('1506300145', 'OP_Pac_ANZ', '2015-06-30 21:06:00.000'), 
('1506300150', 'OP_Pac_ANZ', '2015-06-30 23:09:00.000'), 
('1406180002', 'OP_Pac_ANZ', '2014-06-18 00:43:00.000'), 
('1406180003', 'OP_Pac_ANZ', '2014-06-18 00:45:00.000'), 
('1406220007', 'OP_Pac_ANZ', '2014-06-22 09:24:00.000'), 
('1408280001', 'OP_Pac_ANZ', '2014-08-28 02:13:00.000'), 
('1409070033', 'OP_Pac_ANZ', '2014-09-07 20:28:00.000'), 
('1409080003', 'OP_Pac_ANZ', '2014-09-08 01:12:00.000'), 
('1508100003', 'OP_Pac_ANZ', '2015-08-10 04:10:00.000'), 
('1508110004', 'OP_Pac_ANZ', '2015-08-11 02:54:00.000'), 
('1508130106', 'OP_Pac_ANZ', '2015-08-13 14:26:00.000'), 
('1509300036', 'OP_Pac_ANZ', '2015-09-30 05:08:00.000'), 
('1508190197', 'OP_Pac_ANZ', '2015-08-19 20:24:00.000'), 
('1509230005', 'OP_Pac_ANZ', '2015-09-23 01:18:00.000'), 
('1509230194', 'OP_Pac_ANZ', '2015-09-23 21:41:00.000'), 
('1511230002', 'OP_Pac_ANZ', '2015-11-23 04:13:00.000'), 
('1511240121', 'OP_Pac_ANZ', '2015-11-24 21:05:00.000'), 
('1601240046', 'OP_Pac_ANZ', '2016-01-24 21:41:00.000'), 
('1603200028', 'OP_Pac_ANZ', '2016-03-20 22:46:00.000'), 
('1602010003', 'OP_Pac_ANZ', '2016-02-01 03:35:00.000'), 
('1608090001', 'OP_Pac_ANZ', '2016-08-09 00:49:00.000'); 

回答

0

也許問題是PIVOT條款說FOR [Period] IN ([1], [2], ...)和這些都不是,事實上,[Period]值。

FOR [Period] IN (['20151'], ['20152'], ...) 

(或者類似的,我沒有一個很好的地方來測試確切的語法)應該可以工作。如果您不想特別編碼年/季度值,則可以直接使用Period而不是Period的排序功能(但這仍然會根據要顯示的值的數量做出一些假設)

順便說一句,您在WHERE子句中有LEFT JOIN的「右」表,這會破壞外連接。您應該將該條件移至聯接的ON條款。

+0

好的 - 我想我在where子句中從左連接修復了pivot子句和「右」表。這是我的新SQL,但我仍然獲得所有返回的NULL值。 – Tony

0

我想這種關係可能會被重新檢查?如果您從示例數據中檢索NULL值,那麼COALESCE當然不會從第一列中找到數據,這很可能會在您的數據字段中解釋NULL。

+0

我把COALESCE部分拿出來了,而且我仍然得到了所有的空值。我還想指出原始數據的select語句確實能夠取得預期的結果。我不知道爲什麼我無法調整輸出結果。 – Tony