SQL: 在使用EXCEPT时如何获取COUNT

6
SELECT 'COUNT=' + CONVERT(VARCHAR(64), COUNT(s.company)) AS sites 
FROM   site s 
WHERE  s.sitetype = 'om' 
       AND s.status = 1 
EXCEPT 
SELECT DISTINCT sg.company 
FROM   snmpmibdevice AS sdevice 
       JOIN site sg 
         ON sg.guid = sdevice.siteguid 
       JOIN snmpmibdata sdata 
         ON sdata.snmpmibdeviceguid = sdevice.snmpmibdeviceguid 
WHERE  sdata.sampletimestamp > Dateadd (mi, -15, Getutcdate()) 
       AND sg.sitetype = 'OM' 

基本上,我正在尝试从中返回公司名称的数量。如果我删除计数并只选择“S.Company”,我将获得2个值(我想要“COUNT = 2”),但是使用计数它将出现34条记录(COUNT = 34)。
我会非常感激任何帮助。谢谢!

1
即时SQL格式化程序。使用它,热爱它。 - James Hill
在这个上下文中,这并不重要,但是您预计会计算多少行?VARCHAR(64)?如果使用最宽的8字节bigint值,CONVERT(varchar(20),COUNT(s.company))就足够了。 - KM.
1
...除了选择不同的… - 您不需要使用DISTINCT关键字,因为默认情况下EXCEPT已经意味着EXCEPT DISTINCT(令人惊讶的是,SQL Server不支持显式的EXCEPT DISTINCT并会生成一个“语法错误”信息,而EXCEPT ALL则会生成更有意义的错误信息:“不支持EXCEPT操作符的'ALL'版本”。实际上,即使您想覆盖EXCEPT DISTINCT,也无法这样做,即“...除了选择全部...”仍将为您提供“DISTINCT”结果...这是一件好事 :) - onedaywhen
1
@onedaywhen:实际上,在SQL Server中,所有三个集合运算符(UNIONINTERSECTEXCEPT)与DISTINCT关键字组合时都会生成语法错误。我同意,这很奇怪,因为在所有其他接受DISTINCT的地方,ALL也是一个选项(尽管默认)。所以,如果这三个运算符接受ALL,为什么不允许DISTINCT呢... - Andriy M
1个回答

12

将整个内容包含在 "select count(*) from ()" 中。

SELECT 'COUNT=' + CONVERT(VARCHAR(64), COUNT(company)) AS sites 
FROM (

    SELECT s.company
    FROM   site s 
    WHERE  s.sitetype = 'om' 
           AND s.status = 1 
    EXCEPT 
    SELECT DISTINCT sg.company 
    FROM   snmpmibdevice AS sdevice 
           JOIN site sg 
             ON sg.guid = sdevice.siteguid 
           JOIN snmpmibdata sdata 
             ON sdata.snmpmibdeviceguid = sdevice.snmpmibdeviceguid 
    WHERE  sdata.sampletimestamp > Dateadd (mi, -15, Getutcdate()) 
           AND sg.sitetype = 'OM' 
) a

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