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