0

ssrsレポートで次のクエリを使用しています。

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句に配列などを入れる方法はありますか?ありがとう。

4

3 に答える 3

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)
于 2012-04-05T20:38:52.753 に答える
1

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

この MSDN の記事Using Outer Joinsには、より完全な情報があります。

左外部結合を使用してクエリを書き直しました。ケースステートメントで追加の作業を行う必要があるかもしれませんが、おそらくそうではありません-パラメーター値が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)
于 2012-04-04T17:17:05.103 に答える
0

も使用する場合LEFT JOIN。ただし、月を取得するには集計テーブルを使用することをお勧めします。これは、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)
于 2012-04-05T14:59:37.033 に答える