在SQL语句中分组?

在SQL语句中分组?,sql,sql-server,case-expression,Sql,Sql Server,Case Expression,我在SQL中有一个查询,其中我显示了一个人是否有付款或未付费用。在这个查询中,我有一个case语句,但我需要将记录分组在一起,以确保将付款添加到一起,以便我检查的内容是正确的 让我展示一下代码,希望这会更有意义 以下是我当前使用的查询: Declare @tmpTable Table ( [Bid #] int, Name varchar(200), Spent numeric(18,2), Paid numeric(18,2), [Credit Card On F

我在SQL中有一个查询,其中我显示了一个人是否有付款或未付费用。在这个查询中,我有一个case语句,但我需要将记录分组在一起,以确保将付款添加到一起,以便我检查的内容是正确的

让我展示一下代码,希望这会更有意义

以下是我当前使用的查询:

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中是否有我缺少的东西可以让我需要的事情发生


我提前感谢您的帮助。

我怀疑您在您的组中包含了一些您不需要的字段,有些字段应该聚合。我查看了您的输出,这是我可以推理为一个查询来实现的。尝试一下,看看这是否是您所尝试的:

编辑:这将连接注释列

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

我尝试了这个,但是结果和我原来的代码一样。感谢你的回答。比我现在拥有的干净多了。不幸的是,同样的结果。事实上。。。问题是Notes专栏。你需要移除它。请参见我的编辑否,它的唯一值是“是”或“否”。在数据库中,该位字段的记录实际上是空的,但我认为我必须首先对第一部分进行编码的方式会在查询的第一部分中用case语句的“Else”部分解释空值。对于Bid#108的其中一个条目,有一个注释,所以它将其丢弃。您需要从语句中删除Notes列。在最初填充@tmpTable时,我使用0 if NULL对事务进行求和,但这不会显示单个事务。您是否认为应该以某种方式修改代码的第一部分,以显示单个交易,但对于显示实际等于余额的余额的多个记录,仍然显示0余额?(希望这是有道理的。)