【问题标题】:SQL Count Aggregate with Multiple Having Conditions具有多个条件的 SQL 计数聚合
【发布时间】:2016-09-29 00:10:08
【问题描述】:

我正在尝试编写一个 SQL 查询,它只返回在同一日期有多个交易的员工(count(TransactionDate) > 1),但交易发生在不同的商店 ID 中。我正在尝试使用计数聚合和拥有的组合,但似乎无法返回正确的值。临时表会是更好的方法,还是子查询?我的以下查询未返回准确的记录。任何帮助表示赞赏。谢谢!

EmployeeID  | StoreID | TransactionDate
--------------------------------------
     1      |   1     | 2016-09-09    --should be returned
--------------------------------------
     1      |   2     | 2016-09-09    --should be returned
--------------------------------------
     1      |   3     | 2016-09-09    --should be returned
--------------------------------------
     1      |   1     | 2016-09-18    --should not be returned
--------------------------------------
     2      |   1     | 2016-09-09    --should not be returned
--------------------------------------
     2      |   1     | 2016-09-09    --should not be returned
--------------------------------------
     3      |   1     | 2016-09-09    --should not be returned
--------------------------------------
     4      |   5     | 2016-09-09    --should be returned
 --------------------------------------
     4      |   6     | 2016-09-09    --should be returned

select top 1000 EmployeeID, StoreID, TransactionDate, count(StoreID)[StoreCount], count(TransactionDate)[Transaction Count]
from myTable  
group by EmployeeID, StoreID, TransactionDate
having count(StoreID) > 1 and count(TransactionDate) > 1
order by TransactionDate desc

【问题讨论】:

  • 哪个rdbms? sql-sever,mysql,oracle,...?它有所不同,因为这是窗口函数的完美示例

标签: sql count having-clause


【解决方案1】:
SELECT t.*
FROM
    (
       SELECT
          EmployeeId, TransactionDate
       FROM
          Table
       GROUP BY
          EmployeeId, TransactionDate
       HAVING
          COUNT(DISTINCT StoreId) > 1
    ) e
    INNER JOIN Table t
    ON e.EmployeeId = t.EmployeeId
    AND e.TransactionDate = t.TransactionDate

实际上窗口函数在这里并没有太大帮助,因为关键是 COUNT(DISTINCT StoreId) 按 Employee & TransactionDate 分组,并且不允许使用 COUNT(DISTINCT) OVER ()。所以派生表是可行的方法,这种语法几乎适用于所有典型的 RDBMS。

【讨论】:

    【解决方案2】:

    如果您只想要员工:

    SELECT DISTINCT EmployeeId
    FROM myTable t
    GROUP BY EmployeeId, TransactionDate
    HAVING MIN(StoreId) <> MAX(StoreId);
    

    这是select distinctgroup by 一起使用的极少数情况之一。所以这种查询是比较特殊的东西。

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 2014-12-12
      • 1970-01-01
      • 2022-11-29
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多