在存储过程中添加 SQL 服务器中不同表的列

Adding columns from different tables in SQL Server within a stored procedure

我正在编写此存储过程以使用连接和简单逻辑从 4 个不同的表中获取详细信息,但最终使用 UNION os 累积所有内容时无法正常工作,因为我收到错误:期待 AS ,ID 或 quoted_id, 请指出我在这方面做错了什么。

ALTER PROCEDURE [dbo].[cp_RejectionAnalysis] 
    (@RunDate DATE --'20150501')
AS
BEGIN
    SET NOCOUNT ON; 

    --DECLARE @RunDate DATE = '20150401'
    DECLARE @StartDate DATE = DATEADD(DD, -30, @RunDate);

    DECLARE @GeRejectionDate AS TABLE (PayerName VARCHAR(120), 
                                       ClaimCount INT);

    WITH  rejections AS 
    (
        SELECT 
            i.Number,
            COUNT(DISTINCT CASE WHEN far.SubmissionDate < @RunDate THEN far.ClaimKey ELSE NULL END) AS TotalRejectsFirst30, 
            COUNT(DISTINCT CASE WHEN far.SubmissionDate = @RunDate THEN far.ClaimKey ELSE NULL END) AS TotalRejectsRunDate
        FROM 
            table1 far
        INNER JOIN 
            table2 i ON far.InsurerInfoKey = i.InsurerKey
        WHERE 
            far.isRejection = 1
            AND (far.MessageDate >= @StartDate AND far.MessageDate <= @RunDate)
        GROUP BY 
            i.Number), 
    totalclaims AS 
    (
        SELECT 
            i.Number,
            SUM(CASE WHEN ts.SubmissionDate < @RunDate THEN ts.TotalClaims ELSE 0 END) AS TotalClaimsFirst30, 
            SUM(CASE WHEN ts.SubmissionDate = @RunDate THEN ts.TotalClaims ELSE 0 END) AS TotalClaimsRunDate
        FROM 
            table3 ts
        INNER JOIN 
            table2 i ON ts.InsurerInfoKey = i.InsurerKey
        WHERE 
            ts.SubmissionDate >= @StartDate 
            AND ts.SubmissionDate <= @RunDate
        GROUP BY 
            i.Number
        --ORDER BY i.Number
        )
    /*, PaymentRejectionDetails AS (
        (SELECT DISTINCT ra.Message AS ErrorMessage, ra.ErrorListKey AS ErrorListKey
                        FROM dimErrorListRejectionAnalysis ra
                            INNER JOIN table1 far on ra.ErrorListKey= far.ErrorListKey
                        WHERE (far.MessageDate >= @StartDate AND far.MessageDate <= @RunDate))
                    UNION
                        (SELECT DISTINCT QcHistClaimId AS ClaimId FROM  table1 far
                        WHERE (far.MessageDate >= @StartDate AND far.MessageDate <= @RunDate))
                    UNION
                        (SELECT DISTINCT SITEID FROM table4 ds
                            INNER JOIN table1 far ON ds.sitekey=far.sitekey
                        WHERE (far.MessageDate >= @StartDate AND far.MessageDate <= @RunDate))  
                )*/
        , ClaimsID AS
        (
            SELECT DISTINCT ClaimId 
            FROM table1 far
            WHERE (far.MessageDate >= @StartDate AND far.MessageDate <= @RunDate))
        , SiteId AS
        (
            SELECT DISTINCT SITEID 
            FROM table4 ds
            INNER JOIN table1 far ON ds.sitekey = far.sitekey
            WHERE (far.MessageDate >= @StartDate AND far.MessageDate <= @RunDate))
    SELECT * 
    INTO D 
    FROM
        (SELECT ClaimId FROM ClaimsID 
         UNION 
         SELECT SITEID FROM SiteId
         UNION
         SELECT 
             r.PayerNumber, r.TotalRejectsFirst30, 
             r.TotalRejectsRunDate, 
             ISNULL(t.TotalClaimsFirst30, 0) AS ClaimsFirst30, 
             ISNULL(t.TotalClaimsRunDate, 0) AS ClaimsRunDate
         FROM 
             rejections r
         LEFT OUTER JOIN 
             totalclaims t ON t.PayerNumber = r.PayerNumber)
END

此处UNION的使用无效

 SELECT ClaimId FROM ClaimsID 
 UNION 
 SELECT SITEID FROM SiteId
 UNION
 SELECT r.PayerNumber, r.TotalRejectsFirst30, r.TotalRejectsRunDate, ISNULL(t.TotalClaimsFirst30, 0) AS ClaimsFirst30, ISNULL(t.TotalClaimsRunDate, 0) AS ClaimsRunDate
 FROM rejections r

首先你需要了解UNION

的场景

Combines the results of two or more queries into a single result set that includes all the rows that belong to all queries in the union. The UNION operation is different from using joins that combine columns from two tables.

以下是使用UNION合并两个查询结果集的基本规则:

  1. 所有查询中的列数和顺序必须相同。

  2. 数据类型必须兼容。

编辑 2:

我不确定你真正想要什么,而且你没有回复我的评论。 但我猜你可以尝试使用 LEFT JOIN

SELECT 
    r.PayerNumber,
    r.TotalRejectsFirst30,
    r.TotalRejectsRunDate,
    ISNULL(t.TotalClaimsFirst30, 0) AS ClaimsFirst30,
    ISNULL(t.TotalClaimsRunDate, 0) AS ClaimsRunDate,
    c.ClaimId as ClaimId
FROM rejections r LEFT JOIN ClaimsID c On r.ClaimId=c.ClaimId

请删除最后一个块周围的星号并为子查询添加别名。

            *SELECT * INTO D FROM
            (
            SELECT ClaimId FROM ClaimsID UNION SELECT SITEID FROM SiteId
            UNION
            SELECT r.PayerNumber, r.TotalRejectsFirst30, r.TotalRejectsRunDate, ISNULL(t.TotalClaimsFirst30, 0) AS ClaimsFirst30, ISNULL(t.TotalClaimsRunDate, 0) AS ClaimsRunDate
            FROM rejections r
            LEFT OUTER JOIN totalclaims t ON t.PayerNumber = r.PayerNumber)*  

您不能将行与 number/type 个字段合并。您期望整个过程的最终结果是什么?顺便说一句,发布表的创建脚本将有助于回答这个问题。