現在、SQL Server ステートメントで標準偏差を計算するときに問題に直面しています。
私の問題: 2 つのテーブルがあります。
T1:
Reg_Month
---------
1
2
3
...
T2:
Product Month Consumption
-------------------------------
ProdA 1 200
ProdB 1 10
ProdA 1 300
ProdC 2 100
ProdA 2 200
...
今、私が欲しいのは、1年間のSTDEVを計算するために、次のようなものです:
Reg_Month Product Month Sum
---------------------------------
1 ProdA 1 500
1 ProdB 1 10
1 ProdC 1 0
2 ProdA 2 200
2 ProdB 2 0
2 ProdC 2 0
したがって、このテーブルを設定する必要はありませんが、各製品の「合計」列の STDEV と AVG を計算する必要があります。問題は、NULL を含めることです。
これにより、ProdA に必要なテーブルが得られますが、消費がない場合は常に NULLS になります。
SELECT *
FROM T1
FULL JOIN (SELECT Product, Month, SUM(Consumption) AS Sum,
FROM T2
WHERE (Product = 'ProdA')
GROUP BY Month, Product) sub ON (T1.Reg_Month = T2.Month)`
これにより、STDEVが得られます。
SELECT Stdev(Sum)
FROM
(SELECT *
FROM T1
FULL JOIN (SELECT Product, Month, SUM(Consumption) AS Sum,
FROM T2
WHERE (Product = 'ProdA')
GROUP BY Month, Product) sub ON (T1.Reg_Month = T2.Month)) sub
WHERE Product = 'ProdA'`
しかし、問題は、NULL (結合のために表示される) が無視されるため、消費がなかった月がある場合、1 年全体の正しい STDEV が得られないことです。
私のアプローチ:
ISNULL()
:
SELECT Stdev(Sum)
FROM
(SELECT *
FROM T1
FULL JOIN (SELECT Product, Month, ISNULL(SUM(Consumption), 0) AS Sum,
FROM T2
WHERE (Product = 'ProdA')
GROUP BY Month, Product) sub ON (T1.Reg_Month = T2.Month)) sub
WHERE Product = 'ProdA'`
動作しません (結合後に null が生成されるためでしょうか?)
CASE
:
SELECT Stdev(Sum)
FROM
(SELECT *
FROM T1
FULL JOIN (SELECT Product, Month, CASE WHEN SUM(Consumption) IS NULL THEN 0 ELSE Sum(Consumption) END AS Sum,
FROM T2
WHERE (Product = 'ProdA')
GROUP BY Month, Product) sub ON (T1.Reg_Month = T2.Month)) sub
WHERE Product = 'ProdA'
動かない(多分同じ理由)
私の例を適切に説明できたことを願っています。では、STDEV で適切な結果を得るにはどうすればよいか分かりますか?
ご意見をお待ちしております。
どうもありがとう、
クレメンス