1

このサンプルの 6 番目のレコードは、私の CTE 出力から欠落しています。一回しか出てこないからかな?出現させる方法はありますか?

これがばかげた質問である場合はお詫びします。私はCTEについて頭を悩ませているだけです。

CREATE TABLE #T (MONTH INT, YEAR INT, CC VARCHAR(4), CO_CC VARCHAR(7), VALUE INT)

INSERT INTO #T VALUES (1, 2011, '0000', 'P1-0000', 10)
INSERT INTO #T VALUES (2, 2011, '0000', 'P1-0000', 20)
INSERT INTO #T VALUES (3, 2011, '0000', 'P1-0000', 30)
INSERT INTO #T VALUES (4, 2011, '0000', 'P1-0000', 40)
INSERT INTO #T VALUES (5, 2011, '0000', 'P1-0000', 50)
INSERT INTO #T VALUES (5, 2011, '0017', 'P1-0017', 50)
INSERT INTO #T VALUES (1, 2012, '0000', 'P1-0000', 10)
INSERT INTO #T VALUES (2, 2012, '0000', 'P1-0000', 20)
INSERT INTO #T VALUES (3, 2012, '0000', 'P1-0000', 30)
INSERT INTO #T VALUES (4, 2012, '0000', 'P1-0000', 40)
INSERT INTO #T VALUES (5, 2012, '0000', 'P1-0000', 50)
INSERT INTO #T VALUES (1, 2011, '0006', 'P1-0006', 10)
INSERT INTO #T VALUES (2, 2011, '0006', 'P1-0006', 20)
INSERT INTO #T VALUES (3, 2011, '0006', 'P1-0006', 30)
INSERT INTO #T VALUES (4, 2011, '0006', 'P1-0006', 40)
INSERT INTO #T VALUES (5, 2011, '0006', 'P1-0006', 50)
INSERT INTO #T VALUES (1, 2012, '0006', 'P1-0006', 10)
INSERT INTO #T VALUES (2, 2012, '0006', 'P1-0006', 20)
INSERT INTO #T VALUES (3, 2012, '0006', 'P1-0006', 30)
INSERT INTO #T VALUES (4, 2012, '0006', 'P1-0006', 40)
INSERT INTO #T VALUES (5, 2012, '0006', 'P1-0006', 50)

GO

WITH TEST
AS
(SELECT *, VALUE AS RUNNING_SUM FROM #T WHERE MONTH = 1
UNION ALL
SELECT w.*, w.VALUE + t.RUNNING_SUM FROM #T w 
INNER JOIN TEST t
ON w.MONTH = t.MONTH + 1 
AND w.YEAR = t.YEAR 
AND w.CC = t.CC
AND w.CO_CC = t.CO_CC
WHERE w.MONTH > 1)

SELECT * FROM TEST ORDER BY YEAR, MONTH OPTION (MAXRECURSION 0)

DROP TABLE #T

さらに、VALUE を DECIMAL (15, 2) として宣言すると、アンカーと再帰型が互換性がないというエラーで CTE が失敗しますか?

4

3 に答える 3

3

MONTH never = 1 for CC = '0017' であるため、WHERE 基準はその行を除外しています。

MONTH = 1 で始める代わりに、aROW_NUMBER OVER (PARTITION BY CC,YEAR ORDER BY MONTH) を使用して最初の月を識別できます。

于 2013-06-19T18:08:43.763 に答える
1

UNION ALL では、W.MONTH = #T.MONTH + 1 AND w.YEAR = t.YEAR AND w.CC = t.CC AND w.CO_CC = t で CTE を実際のテーブルに結合すると、6 番目のレコードは決して来ません。 .CO_CC これは、月 5 と年 2011 および月 4 CC (0000) = 月 5 CC (0017) と結合した月 4 を意味し、月 4 CO_CC (P1-0000) = 月 5 CO_CC (P1-0017) を意味します。再び真実ではありません。それが6列目が来ない理由です。これでお分かりいただけたと思います。

于 2013-06-19T18:17:38.733 に答える