1

我有以下查询:

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(或其中一列)有值,那么我得到如下结果:

编号,平均

4、5.12631578947368

如果column_1column_2并且column_3NULL值,则查询不会返回任何行,如下所示:

编号,平均

我的问题是,如果列内容值,我如何获得以下结果NULL

编号,平均

4、空

4

2 回答 2

1

您是否尝试过使用 COALESCE 或 ISNULL?

例如

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

这确实意味着您将得到 0 作为结果而不是 'NULL' -当它们都为 NULL 时你需要null 吗?

编辑:

另外,有没有需要一个unpivot?既然您指定了所有 3 列,为什么不这样做:

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

这为您提供相同的结果,但使用 NULL

当然,这是假设您每个 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 

您需要确保这将起作用,就好像您在 column2/3 中有一个值,那么 column_1 将不再 = -1。可能值得做一个案例,看看它们是否都是 NULL,在这种情况下,用 -1 替换第一个 null

于 2012-07-02T12:23:41.673 回答
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
于 2012-07-02T13:25:49.653 回答