【问题标题】:INNER JOIN on CTE (Common Table Expression) Without PK没有 PK 的 CTE(公用表表达式)上的 INNER JOIN
【发布时间】:2014-04-18 21:42:29
【问题描述】:

我有一个 CTE,我在其中找到匹配 5 列的重复记录:

    ;WITH DuplicateCount AS
    (
    SELECT 
                   FirstName, 
                   LastName, 
                   DateofBirth,  
                   Email,  
                   c1.Status, 
                   Count(*) AS TotalCount
    FROM Customer c
    INNER JOIN Customer_1 c1 ON c1.customerID = c.customerID
    GROUP BY   FirstName, LastName, DateofBirth, Email, c1.Status
    HAVING COUNT(*) > 1
    )

然后我从该 CTE 中选择 Status 和 TotalCount 并加入 Enum 表以生成可读数据

;WITH DuplicateCount AS
(
SELECT 
               FirstName, 
               LastName, 
               DateofBirth,  
               Email,  
               c1.Status, 
               Count(*) AS TotalCount
FROM Customer c
INNER JOIN Customer_1 c1 ON c1.customerID = c.customerID
GROUP BY   FirstName, LastName, DateofBirth, Email, c1.Status
HAVING COUNT(*) > 1
)

SELECT e.Display, dc.TotalCount
FROM DuplicateCount dc
INNER JOIN Enum e ON dc.Status = e.Index

在这种情况下,我能够提取可读数据并使用 Excel 按状态吐出重复的图表报告。

问题

我需要再次加入Customer_1 表以再收集一列:Stage。以下是我尝试的方法:

;WITH DuplicateCount AS
(
SELECT         customerID,
               FirstName, 
               LastName, 
               DateofBirth,  
               Email,  
               c1.Status, 
               Count(*) AS TotalCount
FROM Customer c
INNER JOIN Customer_1 c1 ON c1.customerID = c.customerID
GROUP BY   customerID, FirstName, LastName, DateofBirth, Email, c1.Status
HAVING COUNT(*) > 1
)

SELECT e.Display, 
       CASE 
            WHEN c1.Stage = 6 THEN 'First'
            WHEN c1.Stage = 7 THEN 'Second'
            WHEN c1.Stage = 8 THEN 'Third'
            WHEN c1.Stage = 11 THEN 'Fourth'
            WHEN c1.Stage = 9 THEN 'Fifth'
            WHEN c1.Stage = 10 THEN 'Sixth'
            WHEN c1.Stage = 12 THEN 'Unknown'
            ELSE ''
       END AS Stage,
       dc.TotalCount
FROM DuplicateCount dc
INNER JOIN Enum e ON dc.Status = e.Index
INNER JOIN Customer_1 c1 ON c1.customerID = dc.customerID

显然,这不起作用,因为我的所有记录都不会有重复的 PK。

有没有办法在没有 PK 的情况下将表加入我的 CTE?或者以某种方式将 PK 添加到我的 CTE 而不按它分组?

编辑:这就是我想要实现的目标


|名字 |姓氏 |舞台 |总数

|约翰 |史密斯 |第一 | 2

|约翰 |史密斯 |第三| 2

|亚历克斯 |史密斯 |第一 | 2

|简 |史密斯 |第三| 2

|简 |史密斯 |第一 | 2

|杰克 |史密斯 |第二 | 2

那么,在报告这些数据时:

  • John Smith 共有 4 条记录。 第一中有两个,第三中有两个

  • Alex Smith 共有 2 条记录。 第一

  • 中的两个
  • 简·史密斯共有 4 条记录。 第一中有两个,第三

  • 中有两个
  • Jack Smith 总共有 2 条记录。 二分之二

绘制这些数据时,我应该能够看到:

  • 第一名:共 6 个。

  • 第二次:共 2 次。

  • 第三:共 4 个。

理想情况下,我还可以引入 CreatedDate 并开始收集随时间变化的数据报告:

  • 每个阶段有多少副本。

  • 每个人有多少重复项。

  • 特定日期范围、事件等的重复次数。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    两组数据的基数不匹配。我的意思是第一组具有已识别重复项的数据是跨多个客户的聚合数据(未识别任何客户)。然后,您不能获取多个单独的客户 ID 并将它们归结为聚合行。

    我认为您需要做的是重新构建您试图从数据中获取的内容并向后工作。发布一组您试图实现的示例结果。

    更新:

    您似乎想要一个包含计数的客户\阶段组列表?:

    SELECT     customerID,
               FirstName, 
               LastName, 
               DateofBirth,  
               Email,  
               c1.Status, 
           CASE 
            WHEN c1.Stage = 6 THEN 'First'
            WHEN c1.Stage = 7 THEN 'Second'
            WHEN c1.Stage = 8 THEN 'Third'
            WHEN c1.Stage = 11 THEN 'Fourth'
            WHEN c1.Stage = 9 THEN 'Fifth'
            WHEN c1.Stage = 10 THEN 'Sixth'
            WHEN c1.Stage = 12 THEN 'Unknown'
            ELSE ''
       END AS Stage,
               Count(*) AS TotalCount
    
    FROM Customer c
    INNER JOIN Customer_1 c1 ON c1.customerID = c.customerID
    GROUP BY   customerID, FirstName, LastName, DateofBirth, Email, c1.Status, c1.Stage
    HAVING COUNT(*) > 1
    

    【讨论】:

    • 感谢您的回复。我已经用预期的结果编辑了我的原始帖子。最终,我想在舞台上显示重复但不匹配。我可以将 Stage 放在我的 CTE 中,但我不想 GROUP BY 那样,因为可能存在具有不同阶段的重复项。
    • 请您为相同和不同的客户添加更多示例行。目前还不清楚你想要实现什么。
    • 我接受了这个答案,因为你是对的,我正在寻找的基数与我正在寻找的不匹配。我还意识到数据集存在更多问题。无论如何,谢谢你的回答。
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多