具有多个条件的SQL计数聚合

具有多个条件的SQL计数聚合,sql,count,having-clause,Sql,Count,Having Clause,我试图编写一个SQL查询,只返回在同一日期有多个事务(count(TransactionDate)>1)但事务发生在不同存储ID中的员工。我试图使用count聚合和having的组合,但似乎无法返回正确的值。临时表是更好的方法,还是子查询?我下面的查询没有返回准确的记录。感谢您的帮助。谢谢 EmployeeID | StoreID | TransactionDate -------------------------------------- 1 | 1 | 2

我试图编写一个SQL查询,只返回在同一日期有多个事务(count(TransactionDate)>1)但事务发生在不同存储ID中的员工。我试图使用count聚合和having的组合,但似乎无法返回正确的值。临时表是更好的方法,还是子查询?我下面的查询没有返回准确的记录。感谢您的帮助。谢谢

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

实际上,窗口函数在这里没有多大帮助,因为关键是按员工分组的计数(不同的StoreId)&不允许使用TransactionDate和COUNT(不同的)OVER()。因此,派生表是一种方法,这种语法将适用于几乎所有典型的RDBMS。

如果您只需要员工:

SELECT DISTINCT EmployeeId
FROM myTable t
GROUP BY EmployeeId, TransactionDate
HAVING MIN(StoreId) <> MAX(StoreId);
选择不同的员工ID
来自MyT表
按员工ID、交易日期分组
具有最小(存储ID)和最大(存储ID);

这是将
select distinct
groupby
一起使用的极少数情况之一。因此,这种类型的查询是一件非常特殊的事情。

哪种rdbms?sql服务器、mysql、oracle等等,。。。?这会有所不同,因为这是一个完美的窗口函数示例
SELECT DISTINCT EmployeeId
FROM myTable t
GROUP BY EmployeeId, TransactionDate
HAVING MIN(StoreId) <> MAX(StoreId);