2014-01-05 3 views
0

У меня есть запрос в SQL, в котором я представляю, имеет ли человек платежи или невыплаченные платежи. В этом запросе у меня есть аргумент case, но мне нужно объединить записи вместе, чтобы убедиться, что платежи добавлены вместе, так что то, что я проверяю, является правильным.Группировка в 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, которое я пропускаю, что позволит мне то, что мне нужно случиться?

Я ценю вашу помощь заранее.

ответ

0

Мое подозрение, что вы включаете некоторые поля в свою группу GROUP BY, которые вам не нужны, и некоторые из них должны быть агрегированы. Я посмотрел на ваш результат, и это то, что я мог бы рассуждать в качестве запроса для достижения этого. Попробуйте это и посмотреть, если это то, что вы пытаетесь:

EDIT: Это сцепить ваши замечания колонка

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

Я попытался это, но результат был тот же, как и мой исходный код. Цените ответ. Гораздо чище, чем у меня до сих пор. К сожалению, такой же результат. – DadTo2

+0

На самом деле ... проблема заключается в столбце «Примечания». Вам нужно удалить его. См. Мое редактирование –

+0

Нет, единственными значениями были бы «Да» или «Нет». В базе данных запись для этого битового поля фактически равна NULL, но я думал, что способ, которым я должен сначала кодировать часть, будет учитывать значения NULL с помощью «Else» части оператора case в первой части запроса. – DadTo2

Смежные вопросы