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

、および(またはこの列の1つ)に値がある場合column_1、次のような結果が得られます:column_2column_3

ID、平均

4、5.12631578947368

column_1column_2あり、値column_3がある場合NULL、クエリは次のように行を返しません。

ID、平均

私の質問は、列の内容がNULL値の場合、次の結果を取得するにはどうすればよいですか?

ID、平均

4、ヌル

4

2 に答える 2

1

COALESCEまたはISNULLを使用してみましたか?

例えば

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

これは、結果として「NULL」ではなく0が返されることを意味しますが、すべてNULLの場合はnullが必要ですか?

編集:

また、ピボットを解除する必要はありますか?3つの列すべてを指定しているので、次のようにしてください。

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

これにより、同じ結果が得られますが、NULLが使用されます

もちろん、これは、bankidごとに1つの行があることを前提としています

編集:

UNPIVOTは、私が見る限り、このように使用されることは想定されていません。最初にピボットを解除してから、AVGを試してみます...試してみましょう...

編集:

ああ、私はそれを取り戻します、それはNULLの問題です-他の投稿は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であるかどうかを確認するためにケースを実行する価値があるかもしれません。その場合、最初のnullを-1に置き換えます。

于 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 に答える