2012-07-02 106 views
1

我有以下查詢:如何在UNPIVOT後獲得空列?

WITH data AS( 
    SELECT * FROM partstat WHERE id=4 
) 
SELECT id, AVG(Value) AS Average 
FROM (
    SELECT id, 
    AVG(column_1) as column_1, 
    AVG(column_2) as column_2, 
    AVG(column_3) as column_3 
    FROM data 
    GROUP BY id 
) as pvt 
UNPIVOT (Value FOR V IN (column_1,column_2,column_3)) AS u 
GROUP BY id 

如果column_1column_2column_3(或該列之一)具有值然後我得到結果如下所示:

ID,平均

4,5.12631578947368

如果column_1column_2column_3NULL值,則查詢不返回任何行,如下所示:

ID,平均

我的問題是我如何能得到如下面的結果,如果列內容NULL值?

ID,平均

4,NULL

回答

1

您是否嘗試過使用COALESCE或ISNULL?

例如

ISNULL(AVG(column_1), 0) as column_1, 

這意味着你會得到0的結果,而不是「NULL」,但 - 你需要空時,他們都爲空?

編輯:

此外,是否有任何需要unpivot?既然你指定所有3列,爲什麼不只是做:

SELECT BankID, (column_1 + column_2 + column_3)/3 FROM partstat 
WHERE bankid = 4 

這給你同樣的結果,但與空

當然,這是假設你有每bankid 1行

編輯:

UNPIVOT不應該是這樣的,據我可以看到使用 - 我第一次UNPIVOT然後嘗試AVG ...讓我有去...

編輯:

啊我回過頭來看,它只是一個NULL的問題 - 其他帖子建議ISNULL或COALESCE消除空值,你可以使用像-1這樣的佔位符值,它可以工作,例如,

SELECT bankid, AVG(CASE WHEN value = -1 THEN NULL ELSE value END) AS Average 
FROM ( 
    SELECT bankid, 
    isnull(AVG(column_1), -1) as column_1 , 
    AVG(Column_2) as column_2 , 
    Avg(column_3) as column_3 
    FROM data  
    group by bankid 
) as pvt 
UNPIVOT (Value FOR o in (column_1, column_2, column_3)) as u 
GROUP BY bankid 

您需要確保這將工作,雖然如果您在第2/3列中有值,那麼column_1不會再等於-1。這可能是值得做的情況下,看看他們都空在這種情況下,用-1替換第一空

1

這裏是沒有UNPIVOT一個例子:

DECLARE @partstat TABLE (id INT, column_1 DECIMAL(18, 2), column_2 DECIMAL(18, 2), column_3 DECIMAL(18, 2)) 
INSERT @partstat VALUES 
(5, 12.3, 1, 2) 
,(5, 2, 5, 5) 
,(5, 2, 2, 2) 
,(4, 2, 2, 2) 
,(4, 4, 4, 4) 
,(4, 21, NULL, NULL) 
,(6, 1, NULL, NULL) 
,(6, 1, NULL, NULL) 
,(7, NULL, NULL, NULL) 
,(7, NULL, NULL, NULL) 
,(7, NULL, NULL, NULL) 
,(7, NULL, NULL, NULL) 
,(7, NULL, NULL, NULL) 


;WITH data AS( 
    SELECT * FROM @partstat 
) 
SELECT 

     pvt.id, 
     (ISNULL(pvt.column_1, 0) + ISNULL(pvt.column_2, 0) + ISNULL(pvt.column_3, 0))/ 
     NULLIF(
      CASE WHEN pvt.column_1 IS NULL THEN 0 ELSE 1 END + 
      CASE WHEN pvt.column_2 IS NULL THEN 0 ELSE 1 END + 
      CASE WHEN pvt.column_3 IS NULL THEN 0 ELSE 1 END 
     , 0) 
     AS Average 
FROM (
    SELECT id, 
    AVG(column_1) as column_1, 
    AVG(column_2) as column_2, 
    AVG(column_3) as column_3 
    FROM data 
    GROUP BY id 
) as pvt