Как я могу объединить эти запросы? - PullRequest
2 голосов
/ 01 июня 2009

У меня есть 5 запросов, которые я бы хотел объединить. По сути, они идут по базе данных и выбирают, сколько арендатор заплатил, и сколько арендатор должен, основываясь на том, как давно ему или ей было предъявлено обвинение.

У меня есть четыре категории
Заряд <30 дней <br> Заряд <60 AND> = 30 дней
Заряд <90 AND> = 60 дней
Заряд> 90 дней

Я знаю, как получить все эти значения отдельно, но как я могу собрать их вместе плюс сумму, которую заплатил арендатор?

Вот мои вопросы:
сумма, уплаченная арендатором

SELECT TransactionCode, TenantID, SUM(Amount) AS Paid FROM tblTransaction
WHERE Amount > 0
GROUP BY TransactionCode, TenantID

Заряд менее 30 дней

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedCurrent FROM tblTransaction
WHERE Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE())
GROUP BY TransactionCode, TenantID

Заряд менее 60 дней, но старше 29 дней

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver30 FROM tblTransaction
WHERE Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE())
GROUP BY TransactionCode, TenantID

Заряд менее 90 дней, но старше 59 дней

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver60 FROM tblTransaction
WHERE Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE())
GROUP BY TransactionCode, TenantID

Заряд старше 89 дней

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver90 FROM tblTransaction
WHERE Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE())
GROUP BY TransactionCode, TenantID

Как я могу получить все это одним запросом?

Ответы [ 5 ]

7 голосов
/ 01 июня 2009

Это можно сделать так:

SELECT TransactionCode, TenantID, 
SUM(CASE WHEN Amount > 0 then Amount ELSE 0 END) AS Paid,
SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE()) THEN Amount ELSE 0 END) AS ChargedCurrent,  
SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE()) THEN Amount ELSE 0 END) AS ChargedOver30
SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE()) then Amount Else 0 END) AS ChargedOver60,
SUM(CASE WHEN Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE()) THEN Amount ELSE 0 END) AS ChargedOver90 
FROM tblTransaction
GROUP BY TransactionCode, TenantID
1 голос
/ 01 июня 2009

Этот перекрестный запрос должен работать:

SELECT 
Case WHEN Amount > 0 Then Amount Else 0 End as [Total],
Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE())
    Then Amount Else 0 End as [Charge 0-29 Days],
Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE()) 
    Then Amount Else 0 End as [Charge 30-59 Days],
Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE()) 
    Then Amount Else 0 End as [Charge 60-89 Days],
Case WHEN Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE())
     Then Amount Else 0 End as [Charge 90+ Days],

ОТ транзакции GROUP BY TransactionCode, TenantID

1 голос
/ 01 июня 2009

Если вы можете сделать прогноз или форму запроса одинаковыми для всех 5 отдельных запросов, вы можете использовать объединение, чтобы не только объединить запросы в один результат, но и упорядочить результаты. Я изменил последний столбец, чтобы он был непротиворечивым и представлял состояние, в котором взимается плата за фильтрацию результатов:

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'Paid' [Status]
FROM tblTransactionWHERE Amount > 0
GROUP BY TransactionCode, TenantID

union

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'Charged Current' [Status]
FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE())
GROUP BY TransactionCode, TenantID

union

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver30' [Status]
FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE())
GROUP BY TransactionCode, TenantID

union

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver60' [Status]
FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE())
GROUP BY TransactionCode, TenantID

union

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver90' [Status]
FROM tblTransactionWHERE Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE())
GROUP BY TransactionCode, TenantID

order by 4 --Status
1 голос
/ 01 июня 2009

при использовании UNION для сшивания наборов результатов будет работать. Вы можете перевести его, используя возможности PIVOT, чтобы получить суммы в отдельных столбцах. Извините, я не могу быть более конкретным, у меня нет моих заметок, и я не знаю точный синтаксис для этого материала на макушке.

0 голосов
/ 01 июня 2009

Добавить дополнительный столбец к каждому запросу

SELECT TransactionCode, TenantID, SUM (Amount) AS ChargedCurrent, 30 как [DaysLate] FROM tblTransaction ...

и затем ОБЪЕДИНЕНИЕ ВСЕХ запросов вместе

...