计算唯一值和非唯一值数量

3
我有一个类似这样的 SQL 表格:
+----+-----------+------------+
| Id | EnquiryId | PropertyId |
+----+-----------+------------+
|  1 |         1 |        20  |
|  2 |         1 |        25  |
|  3 |         1 |        26  |
|  4 |         2 |        20  |
|  5 |         3 |        20  |
|  6 |         4 |        20  |
+----+-----------+------------+
我希望统计出属性 ID 为 20 的询问单独存在的数量和与其他属性共享的数量。
所以结果应该像这样:

独立询问数量:3

共享询问数量:1

可以使用两个 select 语句来实现。
(select count(distinct [EnquiryId]) 
from [EnquiryProperty] where propertyid=20) as 'SingleEnquiry'

这给了我4个结果(我需要它变成3个)。
(select count([PropertyId]) FROM [EnquiryProperty] where propertyid=20 GROUP BY propertyid HAVING COUNT(*) > 1) as 'MultipleEnquiry'

这个搜索没有返回任何结果。


4
你尝试过什么?给我们展示一下你目前的尝试。 - jarlh
请选取每一行中列值不唯一的方法 - Andy K
一个数据库不能是SQL,因为SQL是用于查询数据库的语言。 - DanteTheSmith
@DanteTheSmith 你是对的,我误解了L30n1d45的问题。 - Marcus Ohlsson
@TheGameiswar:谢谢,我不知道那个。 - Marcus Ohlsson
显示剩余8条评论
2个回答

5

一种方法是两个聚合级别。内部级别为每个查询分配标志。第二个级别使用这些标志来获取所需的信息:

select sum(is_20 * (1 - is_not_20)) as single_enquiry,
       sum(is_20 * is_not_20) as shared_enquiry
from (select enquiryid,
             max(case when propertyid = 20 then 1 else 0 end) as is_20,
             max(case when propertyid <> 20 then 1 else 0 end) as is_not_20
      from t
      group by enquiryid
     ) e;

非常感谢@SriniV,这个工作得很好 :) - Marcus Ohlsson
我喜欢先标记再聚合标记的想法。我会记住这个的 :) - DanteTheSmith
@MarcusOhlsson,实际上应该感谢gordonlinoff。 - Srini V

1
你可以用两步完成相同的操作(这样更易理解,且不涉及嵌套):
select count(PropertyId) AS Single20s
from WhateverTableIsCalled
group by EnguryId
having count(PropertyId) = 1

select count(PropertyId) AS Shared20s
from WhateverTableIsCalled
group by EnguryId
having count(PropertyId) > 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接