2012-04-04 2 views
0

ssrsレポートで次のクエリを使用しています。ssrsグラフのsqlクエリでグループ化されていない値を処理する

Declare @Year int = 2012 
Declare @ProdType_ID int = 1 

SELECT 
MONTH(Ord.OrdDate) AS 'MONTH', 
COUNT(CASE WHEN @Year = YEAR(Ord.OrdDate) THEN 1 END) as Order1, 
COUNT(CASE WHEN @Year-1 = YEAR(Ord.OrdDate) THEN 1 END) as 'Order2' 
FROM 
(
select 1 as number 
union 
select 2 
union 
select 3 
union 
select 4 
union 
select 5 
union 
select 6 
union 
select 7 
union 
select 8 
union 
select 9 
union 
select 10 
union 
select 11 
union 
select 12 
) as months 

JOIN Ord on Number = Month(Ord.OrdDate) 
JOIN Prod ON Ord.Prod_ID = Prod.ID 
JOIN ProdType ON Prod.ProdType_ID = ProdType.ID 
WHERE @ProdType_ID = ProdType.ID 
GROUP BY months.number, Month(Ord.OrdDate) 

これは、まだ発生していないか、記録されていない月が表示されないという事実を除いて、正しいグループを持つテーブルを返します。私は、たとえそれがまだ合格していなくても、毎月表示することを希望し、その注文値をゼロにしたいと思います。

FROM句に配列などを配置する方法はありますか?おかげさまで

答えて

1

WHERE句を削除してカウント集計内のすべてのフィルタリングを実行した後で動作しました。

SELECT 
MONTH(Ord.OrdDate) AS 'Month', 
COUNT(CASE WHEN @Year = YEAR(Ord.OrdDate) and @ProdType_ID = ProdType.ID THEN 1 END) AS Order1, 
COUNT(CASE WHEN @Year-1 = YEAR(Ord.OrdDate) and @ProdType_ID = ProdType.ID THEN 1 END) AS Order2 

FROM 
(
SELECT 1 AS Number 
UNION 
SELECT 2 
UNION 
SELECT 3 
UNION 
SELECT 4 
UNION 
SELECT 5 
UNION 
SELECT 6 
UNION 
SELECT 7 
UNION 
SELECT 8 
UNION 
SELECT 9 
UNION 
SELECT 10 
UNION 
SELECT 11 
UNION 
SELECT 12 
) AS Months 

LEFT OUTER JOIN Ord ON Number = MONTH(Ord.OrdDate) 
LEFT OUTER JOIN Prod ON Ord.Prod_ID = Prod.ID 
LEFT OUTER JOIN ProdType ON Prod.ProdType_ID = ProdType.ID 

GROUP BY Months.Number, MONTH(Ord.OrdDate) 
1

OUTER JOINを使用したいと思うかもしれません。 外部結合このクエリは、WHERE条件を満たす行を持つFROM句の「左テーブル」からすべての行を返します。他の表の列の値はNULLになります。したがって、NULLの特別な処理が必要な場合は、selectステートメントで使用される列の値の周りにISNULL関数を追加する必要があります。

このMSDNの記事Using Outer Joinsにはさらに詳しい情報があります。

左外部結合を使用してクエリを書き直しました。 case文にはいくつかの追加作業を行う必要があるかもしれませんが、おそらくそうではありません。 - パラメータ値がNULLの場合、YEAR関数はNULLを返します。

Declare @Year int = 2012 
Declare @ProdType_ID int = 1 

SELECT 
MONTH(Ord.OrdDate) AS 'MONTH', 
COUNT(CASE WHEN @Year = YEAR(Ord.OrdDate) THEN 1 END) as Order1, 
COUNT(CASE WHEN @Year-1 = YEAR(Ord.OrdDate) THEN 1 END) as 'Order2' 
FROM 
(
select 1 as number 
union 
select 2 
union 
select 3 
union 
select 4 
union 
select 5 
union 
select 6 
union 
select 7 
union 
select 8 
union 
select 9 
union 
select 10 
union 
select 11 
union 
select 12 
) as months 

LEFT OUTER JOIN Ord on Number = Month(Ord.OrdDate) 
LEFT OUTER JOIN Prod ON Ord.Prod_ID = Prod.ID 
LEFT OUTER JOIN ProdType ON Prod.ProdType_ID = ProdType.ID 
WHERE @ProdType_ID = ProdType.ID 
GROUP BY months.number, Month(Ord.OrdDate) 
0

LEFT JOINの場合も同様です。しかし、私は月を得るためにTallyテーブルを使うことを提案します。これはSQL Server 2005以降で動作します。

Declare @Year int = 2012 
Declare @ProdType_ID int = 1 

;WITH Months (Number) AS 
(
     SELECT 1 UNION ALL 
     SELECT 1 + Number FROM Months WHERE Number < 12 
) 
SELECT 
MONTH(Ord.OrdDate) AS 'MONTH', 
COUNT(CASE WHEN @Year = YEAR(Ord.OrdDate) THEN 1 END) as Order1, 
COUNT(CASE WHEN @Year-1 = YEAR(Ord.OrdDate) THEN 1 END) as 'Order2' 
FROM 
    Months 
LEFT JOIN Ord on Number = Month(Ord.OrdDate) 
LEFT JOIN Prod ON Ord.Prod_ID = Prod.ID 
LEFT JOIN ProdType ON Prod.ProdType_ID = ProdType.ID 
WHERE @ProdType_ID = ProdType.ID 
GROUP BY months.number, Month(Ord.OrdDate) 
関連する問題