sql-server - SQL 查询,例如带有 OR 条件的 GROUP BY

标签 sql-server sql-server-2005 tsql recursion

我会尝试描述真实情况。在我们公司,我们有一个带有 table 的预订系统,我们称之为客户,其中电子邮件和电话联系方式与每个传入订单一起保存 - 这是我无法更改的系统的一部分。我面临的问题是如何获取唯一客户的数量。对于独特客户,我指的是具有相同电子邮件或相同电话号码的一群人。

示例 1:从现实生活中,您可以想象汤姆和桑德拉结婚了。汤姆订购了 4 种产品,在我们的预订系统中填写了 3 个不同的电子邮件地址和 2 个不同的电话号码,其中一个与桑德拉共用(作为家庭电话),因此我可以假设它们以某种方式连接。桑德拉除了这个共享电话号码外,还填写了她的私有(private)电话号码,并且对于这两个订单,她只使用了一个电子邮件地址。对我来说,这意味着将以下所有行计为一个唯一客户。所以事实上这个独特的客户可能会成长为整个家庭。

ID   E-mail              Phone          Comment
---- ------------------- -------------- ------------------------------
0    tom@email.com       +44 111 111    First row
1    tommy@email.com     +44 111 111    Same phone, different e-mail
2    thomas@email.com    +44 111 111    Same phone, different e-mail
3    thomas@email.com    +44 222 222    Same e-mail, different phone
4    sandra@email.com    +44 222 222    Same phone, different e-mail
5    sandra@email.com    +44 333 333    Same e-mail, different phone

ypercube说我可能需要递归来计算所有这些独特客户

示例 2:这是我想要执行的示例。

是否可以在不使用例如通过使用光标或其他东西进行递归,或者递归是否必要?

ID   E-mail              Phone          Comment
---- ------------------- -------------- ------------------------------
0    linsey@email.com    +44 111 111    ─┐
1    louise@email.com    +44 111 111     ├─ 1. unique customer
2    louise@email.com    +44 222 222    ─┘
---- ------------------- -------------- ------------------------------
3    steven@email.com    +44 333 333    ─┐
4    steven@email.com    +44 444 444     ├─ 2. unique customer
5    sandra@email.com    +44 444 444    ─┘
---- ------------------- -------------- ------------------------------
6    george@email.com    +44 555 555    ─── 3. unique customer
---- ------------------- -------------- ------------------------------
7    xavier@email.com    +44 666 666    ─┐
8    xavier@email.com    +44 777 777     ├─ 4. unique customer
9    xavier@email.com    +44 888 888    ─┘
---- ------------------- -------------- ------------------------------
10   robert@email.com    +44 999 999    ─┐
11   miriam@email.com    +44 999 999     ├─ 5. unique customer
12   sherry@email.com    +44 999 999    ─┘
---- ------------------- -------------- ------------------------------
----------------------------------------------------------------------
Result                                  ∑ = 5 unique customers
----------------------------------------------------------------------

我尝试过使用 GROUP BY 进行查询,但我不知道如何按第一列或第二列对结果进行分组。我正在寻找类似的东西

SELECT COUNT(*) FROM Customers
GROUP BY Email OR Phone

再次感谢您的建议

P.S. 在完全改写之前,我真的很感谢这个问题的答案。现在这里的答案可能与更新不对应,所以如果您打算这样做,请不要在这里投反对票(当然问题除外:)。我完全重写了这篇文章。

感谢并抱歉我的错误开始。

最佳答案

这是使用递归 CTE 的完整解决方案。

;WITH Nodes AS
(
    SELECT DENSE_RANK() OVER (ORDER BY Part, PartRank) SetId
        , [ID]
    FROM
    (
        SELECT [ID], 1 Part, DENSE_RANK() OVER (ORDER BY [E-mail]) PartRank
        FROM dbo.Customer
        UNION ALL
        SELECT [ID], 2, DENSE_RANK() OVER (ORDER BY Phone) PartRank
        FROM dbo.Customer
    ) A
),
Links AS
(
    SELECT DISTINCT A.Id, B.Id LinkedId
    FROM Nodes A
    JOIN Nodes B ON B.SetId = A.SetId AND B.Id < A.Id
),
Routes AS
(
    SELECT DISTINCT Id, Id LinkedId
    FROM dbo.Customer

    UNION ALL

    SELECT DISTINCT Id, LinkedId
    FROM Links

    UNION ALL

    SELECT A.Id, B.LinkedId
    FROM Links A
    JOIN Routes B ON B.Id = A.LinkedId AND B.LinkedId < A.Id
),
TransitiveClosure AS
(
    SELECT Id, Id LinkedId
    FROM Links

    UNION

    SELECT LinkedId Id, LinkedId
    FROM Links

    UNION

    SELECT Id, LinkedId
    FROM Routes
),
UniqueCustomers AS
(
    SELECT Id, MIN(LinkedId) UniqueCustomerId
    FROM TransitiveClosure
    GROUP BY Id
)
SELECT A.Id, A.[E-mail], A.Phone, B.UniqueCustomerId
FROM dbo.Customer A
JOIN UniqueCustomers B ON B.Id = A.Id

关于sql-server - SQL 查询,例如带有 OR 条件的 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280629/

相关文章:

sql-server - SQL Server 2008 Nvarchar(Max) 连接 - 截断问题

tsql - 这是什么 TSQL ".."

mysql - (提供程序 : Named Pipes Provider, 错误:40 - 无法打开与 SQL Server 的连接)

c# - 什么会导致我的 SQL Server 权限从存储过程的一次执行更改为下一次执行?

sql - 按组条件选择寄存器

c# - C#汇编中的SQL汇编错误

sql-server - SQL Server - 空列的性能/大小缺点

sql - 从 sql server 2005 发送关于 @@error 的 dbmail

sql - 连接两个表时计算不同的计数

sql - 按 7 天分组日期,不包括特定日期