2013-11-13 3 views
0

Использование SQL Server 2008: Я пытаюсь написать отчет о транзакциях клиентов, которые произошли за прошлую неделю и которые превышают 1000 долларов США. У меня есть следующий SQL запрос, который даст мне правильные записи, но, очевидно, агрегирует результаты:T-SQL возвращает негруппированные записи, составляющие сумму

SELECT 
    customerID, 
    CAST(createdAt AS DATE) AS transactionDate, 
    SUM(transactionAmount) as dailyTotal, 
FROM transactions 
WHERE createdAt > DATEADD(DAY, -7, GETDATE()) 
GROUP BY clientID, CAST(createdAt AS DATE) 
HAVING SUM(transactionAmount) > 1000 

Результирующее в чем-то вроде:

| customerID | transactionDate | dailyTotal | 
|  1 |  2013-11-01 |  1212 | 
|  2 |  2013-11-01 |  10002 | 
... 
|  1 |  2013-11-02 |  5212 | 

Однако, мне нужно, чтобы получить отдельные записи, которые содержат эти агрегированные результаты, но, очевидно, не могут пропустить заявление GROUP BY. Возможно, то, чего я пытаюсь достичь, невозможно в одном запросе?

ответ

0

Вы хотите что-то вроде этого?

SELECT t.customerID, 
     t.createdAt, 
     t.transactionAmount 
FROM transactions t 
INNER JOIN (
    SELECT 
     customerID, 
    FROM transactions 
    WHERE createdAt > DATEADD(DAY, -7, GETDATE()) 
    GROUP BY clientID, CAST(createdAt AS DATE) 
    HAVING SUM(transactionAmount) > 1000 
) a 
ON a.customerID = t.customerID 
WHERE t.createdAt > DATEADD(DAY, -7, GETDATE()) 
+0

Я принял этот ответ, поскольку он решил мою точную проблему, и синтаксис был знаком. Пример CTE от marc_s также представляет интересную реализацию. – Tykus

0

Вы пробовали использовать КТР с SUM и пунктом OVER()?

;WITH SalesAgg AS  
(
    SELECT 
    customerID, 
    TransactionDate = CAST(createdAt AS DATE), 
    TransactionAmount, 
    TotalSum = SUM(transactionAmount) OVER(PARTITION BY ClientID, CAST(CreatedAt AS DATE) ORDER BY ClientID) 
    FROM transactions 
    WHERE createdAt > DATEADD(DAY, -7, GETDATE()) 
) 
SELECT 
    CustomerID, TransactionDate, TransactionAmount, TotalSum 
FROM 
    SalesAgg 
WHERE 
    TotalSum > 1000.0