我正在尝试编写一个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
答案 0 :(得分: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。
答案 1 :(得分:0)
如果您只是想要员工:
SELECT DISTINCT EmployeeId
FROM myTable t
GROUP BY EmployeeId, TransactionDate
HAVING MIN(StoreId) <> MAX(StoreId);
这是select distinct
与group by
一起使用的极少数情况之一。所以这种类型的查询是一件非常特别的事情。