2016-09-29 3 views
1

Я пытаюсь написать SQL-запрос, который возвращает только сотрудников, которые имеют несколько транзакций в одну дату (count (TransactionDate)> 1), но транзакции произошли в разных идентификаторах магазина. Я пытаюсь использовать комбинацию совокупности и иметь, но не могу возвращать правильные значения. Может ли временная таблица быть лучшим способом сделать это, или, может быть, sub-запрос? Мой нижний запрос не возвращает точные записи. Любая помощь приветствуется. Благодаря!SQL Count Aggregate with Multiple having Conditions

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 
+2

Какой rdbms? sql-sever, mysql, oracle, ...? Это имеет значение, потому что это прекрасный пример для оконных функций. – Matt

ответ

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) Группировать по Сотруднику & TransactionDate и COUNT (DISTINCT) OVER() не допускаются. Таким образом, производная таблица - это путь, и этот синтаксис будет работать практически со всеми типичными РСУБД.

+1

Отлично работает, спасибо! – AndrewC10

0

Если вы хотите сотрудников:

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

Это одна из очень немногих ситуаций, когда select distinct используется с group by. Таким образом, этот тип запроса является довольно особенным.