Агрегат подсчета SQL с несколькими условиями наличия

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

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

person AndrewC10    schedule 29.09.2016    source источник
comment
какие рдбмс? sql-север, mysql, оракул,...? Это имеет значение, потому что это прекрасный пример оконных функций.   -  person Matt    schedule 29.09.2016


Ответы (2)


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

person Matt    schedule 29.09.2016

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

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

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

person Gordon Linoff    schedule 29.09.2016