Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
688 views
in Technique[技术] by (71.8m points)

sql server - SQL query like GROUP BY with OR condition

I'll try to describe the real situation. In our company we have a reservation system with a table, let's call it Customers, where e-mail and phone contacts are saved with each incoming order - that's the part of a system I can't change. I'm facing the problem how to get count of unique customers. With the unique customer I mean group of people who has either the same e-mail or same phone number.

Example 1: From the real life you can imagine Tom and Sandra who are married. Tom, who ordered 4 products, filled in our reservation system 3 different e-mail addresses and 2 different phone numbers when one of them shares with Sandra (as a homephone) so I can presume they are connected somehow. Sandra except this shared phone number filled also her private one and for both orders she used only one e-mail address. For me this means to count all of the following rows as one unique customer. So in fact this unique customer may grow up into the whole family.

ID   E-mail              Phone          Comment
---- ------------------- -------------- ------------------------------
0    [email protected]       +44 111 111    First row
1    [email protected]     +44 111 111    Same phone, different e-mail
2    [email protected]    +44 111 111    Same phone, different e-mail
3    [email protected]    +44 222 222    Same e-mail, different phone
4    [email protected]    +44 222 222    Same phone, different e-mail
5    [email protected]    +44 333 333    Same e-mail, different phone

As ypercube said I will probably need a recursion to count all of these unique customers.

Example 2: Here is the example of what I want to do.

Is it possible to get count of unique customers without using recursion for instance by using cursor or something or is the recursion necessary ?

ID   E-mail              Phone          Comment
---- ------------------- -------------- ------------------------------
0    [email protected]    +44 111 111    ─┐
1    [email protected]    +44 111 111     ├─ 1. unique customer
2    [email protected]    +44 222 222    ─┘
---- ------------------- -------------- ------------------------------
3    [email protected]    +44 333 333    ─┐
4    [email protected]    +44 444 444     ├─ 2. unique customer
5    [email protected]    +44 444 444    ─┘
---- ------------------- -------------- ------------------------------
6    [email protected]    +44 555 555    ─── 3. unique customer
---- ------------------- -------------- ------------------------------
7    [email protected]    +44 666 666    ─┐
8    [email protected]    +44 777 777     ├─ 4. unique customer
9    [email protected]    +44 888 888    ─┘
---- ------------------- -------------- ------------------------------
10   [email protected]    +44 999 999    ─┐
11   [email protected]    +44 999 999     ├─ 5. unique customer
12   [email protected]    +44 999 999    ─┘
---- ------------------- -------------- ------------------------------
----------------------------------------------------------------------
Result                                  ∑ = 5 unique customers
----------------------------------------------------------------------

I've tried a query with GROUP BY but I don't know how to group the result by either first or second column. I'm looking for let's say something like

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

Thanks again for any suggestions

P.S. I really appreciate the answers for this question before the complete rephrase. Now the answers here may not correspond to the update so please don't downvote here if you're going to do it (except the question of course :). I completely rewrote this post.

Thanks and sorry for my wrong start.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Finding groups that have only same Phone:

SELECT
    ID
  , Name
  , Phone
  , DENSE_RANK() OVER (ORDER BY Phone) AS GroupPhone
FROM 
    MyTable
ORDER BY
    GroupPhone
  , ID

Finding groups that have only same Name:

SELECT
    ID
  , Name
  , Phone
  , DENSE_RANK() OVER (ORDER BY Name) AS GroupName
FROM 
    MyTable
ORDER BY
    GroupName
  , ID

Now, for the (complex) query you describe, let's say we have a table like this instead:

ID   Name          Phone
---- ------------- -------------
0    Kate          +44 333 333
1    Sandra        +44 000 000
2    Thomas        +44 222 222
3    Robert        +44 000 000
4    Thomas        +44 444 444
5    George        +44 222 222
6    Kate          +44 000 000
7    Robert        +44 444 444
--------------------------------

Should all these be in one group? As they all share name or phone with someone else, forming a "chain" of relative persons:

0-6   same name
6-1-3 same phone
3-7   same name
7-4   same-phone
4-2   same name
2-5   bame phone

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...