UNION ALL 与 CTE
UNION ALL with CTE
我正在尝试 UNION ALL 两个 tables 1) 当前收据 2) 历史收据。这两个 table 都有 CTE,因为这是将数字字段更改为日期字段的唯一方法。
这是我当前的收据table
;WITH t AS
(SELECT *, ProperDate = CASE WHEN ISDATE(CONVERT(char(8), r.RCLDTE)) = 1 THEN CONVERT(date, CONVERT(char(8), r.RCLDTE)) END
FROM [Repit].[LEVYDTA].[RECTRNT] r)
SELECT [Day of Week] = ProperDate, [Saturday] = DATEADD
(DAY, 6 - ((DATEPART(WEEKDAY, ProperDate) + @@DATEFIRST - 1) % 7), ProperDate)
,CASE WHEN wm.[ITPPCK] = 'B' THEN wp.[PPCQTY] * SUM(t.[RCRQTY]) ELSE 0 END AS 'PREPACKQTY',wp.[PPCQTY],SUM(t.RCRQTY) AS 'RCRQTY'
,t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITPPCK, wm.ITCSPK,ws.WHDNAM,wv.VNVEN#,wv.VNVENN
FROM t
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSITMM] wm
ON t.[RCITM#]=wm.[ITITM#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSVENM] wv
ON wm.[ITVEN#]=wv.[VNVEN#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSWHSM] ws
ON t.[RCWHS#]=ws.[WHWHS#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSPPKM] wp
ON t.[RCITM#]=wp.[PPPPK#]
WHERE ws.WHAFLG = 'Y'
GROUP BY t.ProperDate, wm.ITPPCK, wp.PPCQTY, t.RCRQTY, t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITCSPK
,ws.WHDNAM, wv.VNVEN#, wv.VNVENN
ORDER BY wm.ITPPCK DESC
这是我的历史收据
;WITH t AS
(
SELECT *, ProperDate = CASE WHEN ISDATE(CONVERT(char(8), r.RCLDTE)) = 1
THEN CONVERT(date, CONVERT(char(8), r.RCLDTE)) END
FROM [Repit].[LEVYDTA].[RECTRNH] r
)
SELECT [Day of Week] = ProperDate,[Saturday] = DATEADD (DAY, 6 - ((DATEPART(WEEKDAY, ProperDate) + @@DATEFIRST - 1) % 7), ProperDate)
,CASE WHEN wm.[ITPPCK] = 'B' THEN wp.[PPCQTY] * SUM(t.[RCRQTY]) ELSE 0 END AS 'PREPACKQTY',wp.[PPCQTY],SUM(t.RCRQTY) AS 'RCRQTY'
,t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITPPCK, wm.ITCSPK ,ws.WHDNAM, wv.VNVEN#, wv.VNVENN
FROM t
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSITMM] wm
ON t.[RCITM#]=wm.[ITITM#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSVENM] wv
ON wm.[ITVEN#]=wv.[VNVEN#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSWHSM] ws
ON t.[RCWHS#]=ws.[WHWHS#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSPPKM] wp
ON t.[RCITM#]=wp.[PPPPK#]
WHERE ws.WHAFLG = 'Y' and ProperDate BETWEEN @Last2WeekDATE AND @LWDATE
GROUP BY t.ProperDate, wm.ITPPCK, wp.PPCQTY, t.RCRQTY, t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITCSPK
,ws.WHDNAM, wv.VNVEN#, wv.VNVENN;
所有列名都相同。我认为我只需要将 UNION ALL 放在中间,然后将 GROUP BY 和 ORDER BY 放在最后,它就会起作用。但是,如果我将两个 CTE 都保留为正确的日期,它基本上会给我一个错误“UNION ALL 之后第二个 CTE 附近的语法不正确”。
我知道它看起来像很多文本,但它是两个 table 之间完全相同的字段和相同的连接,这两个 table 之间的唯一区别是 1一张来自 table [RECTRNT] - 最近的收据,第二张来自 [RECTRNH] - 历史收据。
其他都一样。
我会很感激任何想法。
;WITH Current_data_cte AS
(SELECT *, ProperDate = CASE WHEN ISDATE(CONVERT(char(8), r.RCLDTE)) = 1 THEN CONVERT(date, CONVERT(char(8), r.RCLDTE)) END
FROM [Repit].[LEVYDTA].[RECTRNT] r)
,Current_data as(
SELECT [Day of Week] = ProperDate, [Saturday] = DATEADD
(DAY, 6 - ((DATEPART(WEEKDAY, ProperDate) + @@DATEFIRST - 1) % 7), ProperDate)
,CASE WHEN wm.[ITPPCK] = 'B' THEN wp.[PPCQTY] * SUM(t.[RCRQTY]) ELSE 0 END AS 'PREPACKQTY',wp.[PPCQTY],SUM(t.RCRQTY) AS 'RCRQTY'
,t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITPPCK, wm.ITCSPK,ws.WHDNAM,wv.VNVEN#,wv.VNVENN
FROM t
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSITMM] wm
ON t.[RCITM#]=wm.[ITITM#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSVENM] wv
ON wm.[ITVEN#]=wv.[VNVEN#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSWHSM] ws
ON t.[RCWHS#]=ws.[WHWHS#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSPPKM] wp
ON t.[RCITM#]=wp.[PPPPK#]
WHERE ws.WHAFLG = 'Y'
GROUP BY t.ProperDate, wm.ITPPCK, wp.PPCQTY, t.RCRQTY, t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITCSPK
,ws.WHDNAM, wv.VNVEN#, wv.VNVENN
)--ORDER BY wm.ITPPCK DESC
, Historical_data_cte AS
(
SELECT *, ProperDate = CASE WHEN ISDATE(CONVERT(char(8), r.RCLDTE)) = 1
THEN CONVERT(date, CONVERT(char(8), r.RCLDTE)) END
FROM [Repit].[LEVYDTA].[RECTRNH] r
),
Historical_data as(
SELECT [Day of Week] = ProperDate,[Saturday] = DATEADD (DAY, 6 - ((DATEPART(WEEKDAY, ProperDate) + @@DATEFIRST - 1) % 7), ProperDate)
,CASE WHEN wm.[ITPPCK] = 'B' THEN wp.[PPCQTY] * SUM(t.[RCRQTY]) ELSE 0 END AS 'PREPACKQTY',wp.[PPCQTY],SUM(t.RCRQTY) AS 'RCRQTY'
,t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITPPCK, wm.ITCSPK ,ws.WHDNAM, wv.VNVEN#, wv.VNVENN
FROM t
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSITMM] wm
ON t.[RCITM#]=wm.[ITITM#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSVENM] wv
ON wm.[ITVEN#]=wv.[VNVEN#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSWHSM] ws
ON t.[RCWHS#]=ws.[WHWHS#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSPPKM] wp
ON t.[RCITM#]=wp.[PPPPK#]
WHERE ws.WHAFLG = 'Y' and ProperDate BETWEEN @Last2WeekDATE AND @LWDATE
GROUP BY t.ProperDate, wm.ITPPCK, wp.PPCQTY, t.RCRQTY, t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITCSPK
,ws.WHDNAM, wv.VNVEN#, wv.VNVENN;
)
select * from Current_data
union
select * from Historical_data
我正在尝试 UNION ALL 两个 tables 1) 当前收据 2) 历史收据。这两个 table 都有 CTE,因为这是将数字字段更改为日期字段的唯一方法。
这是我当前的收据table
;WITH t AS
(SELECT *, ProperDate = CASE WHEN ISDATE(CONVERT(char(8), r.RCLDTE)) = 1 THEN CONVERT(date, CONVERT(char(8), r.RCLDTE)) END
FROM [Repit].[LEVYDTA].[RECTRNT] r)
SELECT [Day of Week] = ProperDate, [Saturday] = DATEADD
(DAY, 6 - ((DATEPART(WEEKDAY, ProperDate) + @@DATEFIRST - 1) % 7), ProperDate)
,CASE WHEN wm.[ITPPCK] = 'B' THEN wp.[PPCQTY] * SUM(t.[RCRQTY]) ELSE 0 END AS 'PREPACKQTY',wp.[PPCQTY],SUM(t.RCRQTY) AS 'RCRQTY'
,t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITPPCK, wm.ITCSPK,ws.WHDNAM,wv.VNVEN#,wv.VNVENN
FROM t
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSITMM] wm
ON t.[RCITM#]=wm.[ITITM#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSVENM] wv
ON wm.[ITVEN#]=wv.[VNVEN#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSWHSM] ws
ON t.[RCWHS#]=ws.[WHWHS#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSPPKM] wp
ON t.[RCITM#]=wp.[PPPPK#]
WHERE ws.WHAFLG = 'Y'
GROUP BY t.ProperDate, wm.ITPPCK, wp.PPCQTY, t.RCRQTY, t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITCSPK
,ws.WHDNAM, wv.VNVEN#, wv.VNVENN
ORDER BY wm.ITPPCK DESC
这是我的历史收据
;WITH t AS
(
SELECT *, ProperDate = CASE WHEN ISDATE(CONVERT(char(8), r.RCLDTE)) = 1
THEN CONVERT(date, CONVERT(char(8), r.RCLDTE)) END
FROM [Repit].[LEVYDTA].[RECTRNH] r
)
SELECT [Day of Week] = ProperDate,[Saturday] = DATEADD (DAY, 6 - ((DATEPART(WEEKDAY, ProperDate) + @@DATEFIRST - 1) % 7), ProperDate)
,CASE WHEN wm.[ITPPCK] = 'B' THEN wp.[PPCQTY] * SUM(t.[RCRQTY]) ELSE 0 END AS 'PREPACKQTY',wp.[PPCQTY],SUM(t.RCRQTY) AS 'RCRQTY'
,t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITPPCK, wm.ITCSPK ,ws.WHDNAM, wv.VNVEN#, wv.VNVENN
FROM t
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSITMM] wm
ON t.[RCITM#]=wm.[ITITM#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSVENM] wv
ON wm.[ITVEN#]=wv.[VNVEN#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSWHSM] ws
ON t.[RCWHS#]=ws.[WHWHS#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSPPKM] wp
ON t.[RCITM#]=wp.[PPPPK#]
WHERE ws.WHAFLG = 'Y' and ProperDate BETWEEN @Last2WeekDATE AND @LWDATE
GROUP BY t.ProperDate, wm.ITPPCK, wp.PPCQTY, t.RCRQTY, t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITCSPK
,ws.WHDNAM, wv.VNVEN#, wv.VNVENN;
所有列名都相同。我认为我只需要将 UNION ALL 放在中间,然后将 GROUP BY 和 ORDER BY 放在最后,它就会起作用。但是,如果我将两个 CTE 都保留为正确的日期,它基本上会给我一个错误“UNION ALL 之后第二个 CTE 附近的语法不正确”。
我知道它看起来像很多文本,但它是两个 table 之间完全相同的字段和相同的连接,这两个 table 之间的唯一区别是 1一张来自 table [RECTRNT] - 最近的收据,第二张来自 [RECTRNH] - 历史收据。
其他都一样。
我会很感激任何想法。
;WITH Current_data_cte AS
(SELECT *, ProperDate = CASE WHEN ISDATE(CONVERT(char(8), r.RCLDTE)) = 1 THEN CONVERT(date, CONVERT(char(8), r.RCLDTE)) END
FROM [Repit].[LEVYDTA].[RECTRNT] r)
,Current_data as(
SELECT [Day of Week] = ProperDate, [Saturday] = DATEADD
(DAY, 6 - ((DATEPART(WEEKDAY, ProperDate) + @@DATEFIRST - 1) % 7), ProperDate)
,CASE WHEN wm.[ITPPCK] = 'B' THEN wp.[PPCQTY] * SUM(t.[RCRQTY]) ELSE 0 END AS 'PREPACKQTY',wp.[PPCQTY],SUM(t.RCRQTY) AS 'RCRQTY'
,t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITPPCK, wm.ITCSPK,ws.WHDNAM,wv.VNVEN#,wv.VNVENN
FROM t
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSITMM] wm
ON t.[RCITM#]=wm.[ITITM#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSVENM] wv
ON wm.[ITVEN#]=wv.[VNVEN#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSWHSM] ws
ON t.[RCWHS#]=ws.[WHWHS#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSPPKM] wp
ON t.[RCITM#]=wp.[PPPPK#]
WHERE ws.WHAFLG = 'Y'
GROUP BY t.ProperDate, wm.ITPPCK, wp.PPCQTY, t.RCRQTY, t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITCSPK
,ws.WHDNAM, wv.VNVEN#, wv.VNVENN
)--ORDER BY wm.ITPPCK DESC
, Historical_data_cte AS
(
SELECT *, ProperDate = CASE WHEN ISDATE(CONVERT(char(8), r.RCLDTE)) = 1
THEN CONVERT(date, CONVERT(char(8), r.RCLDTE)) END
FROM [Repit].[LEVYDTA].[RECTRNH] r
),
Historical_data as(
SELECT [Day of Week] = ProperDate,[Saturday] = DATEADD (DAY, 6 - ((DATEPART(WEEKDAY, ProperDate) + @@DATEFIRST - 1) % 7), ProperDate)
,CASE WHEN wm.[ITPPCK] = 'B' THEN wp.[PPCQTY] * SUM(t.[RCRQTY]) ELSE 0 END AS 'PREPACKQTY',wp.[PPCQTY],SUM(t.RCRQTY) AS 'RCRQTY'
,t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITPPCK, wm.ITCSPK ,ws.WHDNAM, wv.VNVEN#, wv.VNVENN
FROM t
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSITMM] wm
ON t.[RCITM#]=wm.[ITITM#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSVENM] wv
ON wm.[ITVEN#]=wv.[VNVEN#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSWHSM] ws
ON t.[RCWHS#]=ws.[WHWHS#]
LEFT OUTER JOIN [Repit].[LEVYDTA].[WHSPPKM] wp
ON t.[RCITM#]=wp.[PPPPK#]
WHERE ws.WHAFLG = 'Y' and ProperDate BETWEEN @Last2WeekDATE AND @LWDATE
GROUP BY t.ProperDate, wm.ITPPCK, wp.PPCQTY, t.RCRQTY, t.RCLDTE, t.RCWHS#, t.RCITM#, wm.ITCSPK
,ws.WHDNAM, wv.VNVEN#, wv.VNVENN;
)
select * from Current_data
union
select * from Historical_data