-1

この派生テーブルを返す SQL スクリプトがあります。

MM/YYYY  Cat    Score
02/2012  Test1  19
04/2012  Test1  15
05/2012  Test1  16
07/2012  Test1  14
08/2012  Test1  15
09/2012  Test1  15
12/2012  Test1  11
02/2012  Test2  15
03/2012  Test2  13
05/2012  Test2  18
06/2012  Test2  14
08/2012  Test2  15
09/2012  Test2  14
12/2012  Test2  10

ご覧のとおり、いくつかの MM/YYYY (2012 年 3 月、2012 年 6 月、2012 年 11 月など) が欠落しています。

欠落している MM/YYYY を猫と 0 (ゼロ) フォームのスコアで埋めたいと思います。開始日 (2012 年 1 月) がどうあるべきかはわかっています。

クエリが実行される範囲のすべての MM/YYYY を含むテーブルを結合しようとしましたが、これは最初に出現した行のみを返し、猫ごとに繰り返されません (それを知っている必要があります)。

私の質問はこれです。結合を使用してこれを行うことができますか、それとも一時テーブルでこれを行う必要がありますか?そして、データを出力します。2012 年 1 月から 2012 年 12 月までの日付範囲の 24 行のテーブルを、適切な Cat (Test1 & Test2) と対応するスコア (存在する場合) またはゼロ (存在しない場合) で返したいと考えています。元のテーブル。

AHIGA、LarryR…</p>

4

3 に答える 3

3

いくつかの CTE を使用して目的を達成する方法の例を次に示します。これは 3 つの CTE を使用します。1 つはすべての日付用、もう 1 つはカテゴリ用、そして 3 番目はそれらを交差結合します。3 つ目は本当に冗長ですが、見ているものをもう少しわかりやすくするためのものです。

DECLARE 
     @StartDate datetime = '2/1/2012'
    ,@EndDate datetime = '4/26/2013'
;WITH DATES AS 
(
    SELECT
        CAST(MONTH(@StartDate) as varchar(20)) + '/' + CAST(YEAR(@StartDate) as varchar(20)) 'CurrMonth'
       ,@StartDate as Datefield
    UNION ALL
    SELECT
       CAST(MONTH(CurrDate) as varchar(20)) + '/' + CAST(YEAR(CurrDate) as varchar(20))
       ,CurrDate
    FROM
       DATES
    CROSS APPLY (SELECT DATEADD(month, 1, Datefield)) CxA(CurrDate)
    WHERE CurrDate < @EndDate
)
,CATS AS
(
    SELECT 'Test1' as 'Cat'
    UNION ALL
    SELECT 'Test2'
)
,AllTheThings AS
(
    SELECT
        Datefield
       ,CurrMonth
       ,Cat
    FROM
       DATES D
    CROSS JOIN 
       CATS C
)

SELECT * FROM AllTheThings
于 2013-04-26T18:44:06.860 に答える
0

最善の解決策は、(一時テーブルの上に) 日付テーブルを作成することです。スペースはほとんど必要ありません。

于 2013-04-26T16:51:51.690 に答える