【问题标题】:COUNT() over result of ExceptCOUNT() 超过除结果
【发布时间】:2013-01-24 09:57:06
【问题描述】:

我有一个类似的查询:

SELECT
    id
FROM
    table1
INNER JOIN
    ...
WHERE
    ...
    AND eventtype IN (2000120, 2000121, 2000122, 2000123, 2000130)

EXCEPT

SELECT
    id
FROM
    table1
INNER JOIN
    ...
WHERE
    ...
    AND eventtype IN (2000123,2000130,2000134,2000135)

请注意,除了最后一个 where 子句之外,这两个查询都是相同的。

我现在想计算上述查询返回的记录数。

怎么做?

非常感谢

【问题讨论】:

  • 在查询中只有不同的谓词?
  • 对不起,我不明白。你是什​​么意思?
  • 您是否也需要检索结果集?
  • 不,只有结果的计数。但是JW提供的解决方案很好。除了我必须选择日期和其他条件两次。

标签: sql tsql aggregation


【解决方案1】:

使用COUNT 并将其包装在SUBQUERY

SELECT COUNT(ID)
FROM (
        SELECT id
        FROM table1
        INNER JOIN...
        WHERE...
                AND eventtype IN ( 2000120, 2000121, 2000122, 2000123, 2000130 )
        EXCEPT
        SELECT id
        FROM table1
        INNER JOIN...
        WHERE...
                AND eventtype IN ( 2000123, 2000130, 2000134, 2000135 )
        ) s

【讨论】:

  • 感谢您的快速回复。这行得通...一个由此产生的问题:由于两个子选择完全相同(事件类型除外)...可以优化查询吗?例如,我在两个查询中都有 WHERE 子句 (eventtime BETWEEN '2013-02-08 00:00:00' AND '2013-02-08 23:59:59')
【解决方案2】:

你只需要第一次查询你想要的,如果你不需要它,你不必包括 2000130 值,所以你不想在查询中显示的其他值。

SELECT
    id
FROM
    table1
INNER JOIN
    ...
WHERE
    ...
    AND eventtype IN (2000120, 2000121, 2000122, 2000123)

如果您需要从某些查询中排除某些值,您可以使用

    AND eventtype NOT IN (2000130)

但不能同时进行。并且只计算常规使用 SELECT COUNT(id) 或如果需要的话。

【讨论】:

  • 不错的尝试。但这实际上不起作用,因为查询更复杂。事实上,'id' 减少到一个DISTINCT 值,而更多的值会存在。使用您的变体,我排除了无论如何都不存在的值。我需要这样做。
【解决方案3】:

您也可以将 EXISTS 与 INTERSECT 子查询一起使用

SELECT COUNT(ID)
FROM table1 t1 INNER JOIN ...
WHERE ... AND eventtype IN (2000120, 2000121, 2000122, 2000123, 2000130)
AND NOT EXISTS (
SELECT 1
FROM table1 t2 INNER JOIN ...
WHERE ... AND eventtype IN (2000123, 2000130, 2000134, 2000135)
AND EXISTS (SELECT t1.ID 
            INTERSECT
            SELECT t2.ID))  

【讨论】:

    猜你喜欢
    • 2017-12-15
    • 1970-01-01
    • 2023-03-22
    • 2015-06-12
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多