2012-07-02 99 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