Группировка внутри оператора SQL?
У меня есть запрос в SQL, в котором я представляю, есть ли у человека платежи или невыплаченные платежи. В этом запросе у меня есть описание случая, но мне нужно сгруппировать записи, чтобы убедиться, что платежи складываются вместе, чтобы то, что я проверяю, было правильным.
Позвольте мне показать код, и, надеюсь, это будет иметь больше смысла.
Вот запрос, который я сейчас использую:
Declare @tmpTable Table
(
[Bid #] int,
Name varchar(200),
Spent numeric(18,2),
Paid numeric(18,2),
[Credit Card On File] varchar(3),
SaleCounter int,
Notes varchar(max)
)
Insert into @tmpTable([Bid #], Name, Spent, Paid, [Credit Card On File], SaleCounter, Notes)
Select s.[BidderNumber] as 'Bid #', ltrim(rtrim(b.bidderName)) as 'Name', isnull(s.saleprice * s.Quantity,0) as 'Spent',
isnull(t.Amount,0) as 'Paid',
case
when b.cconfile = 1 then 'Yes'
else
'No'
end as 'Credit Card On File',
s.SaleCounter, isnull(t.Notes, '') as 'Notes'
from sales s inner join Bidders b on s.BidderNumber = b.BidderNumber
Left outer join transactions t on t.BidderNumber = s.BidderNumber
order by s.Biddernumber, b.biddername, b.cconfile, SaleCounter
Select [Bid #], Name, Spent as 'Total Purchases', Paid as 'Current Payments',
case
when [Credit Card On File] = 'Yes' then
case
when cast(Paid as numeric(18,2)) = 0 then cast(Spent as numeric(18,2))
else
case when (sum(cast(Paid as numeric(18,2)))) > sum(cast(Spent as numeric(18,2))) then (cast(Paid as numeric(18,2)))- sum(cast(Spent as numeric(18,2)))
else (cast(Spent as numeric(18,2)) - cast(Paid as numeric(18,2)))
end
end
else 0
end as 'Amount To Charge Credit Card',
case
when [Credit Card On File] = 'No' then
case
when cast(Paid as numeric(18,2)) = 0 then cast(Spent as numeric(18,2))
else
case when (sum(cast(Paid as numeric(18,2)))) > sum(cast(Spent as numeric(18,2))) then (cast(Paid as numeric(18,2)))- sum(cast(Spent as numeric(18,2)))
else (cast(Spent as numeric(18,2)) - cast(Paid as numeric(18,2)))
end
end--sum(Outstanding)
ELSE 0
end as 'Outstanding Balance', Notes
from @tmpTable
group by [Bid #], name, spent, paid, [Credit Card On File], SaleCounter, Notes
order by [Bid #], Name, spent, paid, [Credit Card On File], SaleCounter, Notes
Вот набор записей, который возвращается и вставляется в @tmpTable:
Bid # Name Total Purchases Current Payments Amount To Charge Credit Card Outstanding Balance Notes
101 Tom & Joan Bergland 7500.00 0.00 0.00 7500.
102 John & Bonnie Black 50.00 50.00 0.00 0.00
108 Cindy Davidson 3600.00 1600.00 0.00 2000.00 250
108 Cindy Davidson 3600.00 2000.00 0.00 1600.00
109 Cynthia Davis 315.00 315.00 0.00 0.00 2355
117 Susan Harris 75.00 75.00 0.00 0.00
119 Jim & Julie Hill 520.00 0.00 520.00 0.00
125 Bill & Amy Lee 526.00 526.00 0.00 0.00
Теперь моя проблема заключается в том, что я показываю остаток задолженности по Заявке № 108, когда остаток не причитается. Эти две записи отражают два платежа, выполненных против баланса, и когда они суммируются, они равняются балансу. Мне нужно показать каждый платеж пользователю, но когда платежи равняются общей сумме покупки, баланс не должен отображаться. однако, если есть баланс, это нужно показать. (Платежи по кредитным картам разные... с чем у меня возникают проблемы, это не платежи через CC)
Есть ли способ сгруппировать внутри оператора case или есть что-то в sql, что мне не хватает, что позволит то, что мне нужно, чтобы это произошло?
Я заранее ценю вашу помощь.
1 ответ
Я подозреваю, что вы включаете в свою группу BY BY некоторые поля, которые вам не нужны, а некоторые должны объединяться. Я посмотрел на ваш вывод, и это то, что я мог бы привести в качестве запроса для достижения этой цели. Попробуйте это и посмотрите, пытаетесь ли вы:
РЕДАКТИРОВАТЬ: Это объединит ваш столбец заметок
SELECT
acct.[Bid #],
acct.Name,
SUM(acct.Spent) AS [Total Purchases],
SUM(acct.Paid) AS [Current Payments],
CASE WHEN acct.[Credit Card On File] = 'Yes' THEN ABS(SUM(acct.Spent) - SUM(acct.Paid)) ELSE 0 END AS [Amount To Charge Credit Card],
CASE WHEN acct.[Credit Card On File] = 'No' THEN ABS(SUM(acct.Spent) - SUM(acct.Paid)) ELSE 0 END AS [Outstanding Balance],
note.Notes
FROM
@tmpTable acct
LEFT JOIN
(
SELECT DISTINCT
t2.[Bid #],
SUBSTRING((
SELECT ',' + t1.Notes AS [text()]
FROM @tmpTable t1
WHERE t1.[Bid #] = t2.[Bid #]
ORDER BY [Bid #]
FOR XML PATH (''))
,2,1000) AS Notes
FROM
@tmpTable t2
) note
ON (acct.[Bid #] = note.[Bid #])
GROUP BY
acct.[Bid #],
acct.Name,
acct.[Credit Card On File],
note.Notes