在SQL Server中分组并在一列中连接记录

问题描述 投票:0回答:4

我有一个名为payment_data的视图,包括数字,日期和字符串字段。

company | ref | Tag | event_date | sale_price | Amount  |  Receipt_No  | Paid  |   Balance

PRco Ltd| 123 | 0311| 03-10-2018 |  610000    | 610000  |  R19A0000761 | 50000 |   11000
PRco Ltd| 123 | 0311| 03-10-2018 |  610000    | 610000  |  R19A0000912 | 11000 |    0

此表将进行分组以获得以下结果

company | ref | Tag | event_date | sale_price | Amount  |  Receipt_No                |  Paid  |  Balance
PRco Ltd| 123 | 0311| 03-10-2018 |  610000    | 610000  |  R19A0000761, R19A0000912  | 61000  |    0  

该表按列ref分组,Receipt_No连接得到如上所示。列paid是聚合的,列sale_priceAmount应该是Max()。列balance是要支付的余额。如果客户支付全额,那应该是0。

sql sql-server view group-by
4个回答
0
投票

你可以使用STUFFGROUP BYMIN,MAX,SUM聚合如下,在你的例子paid amount is in 5 digitamount in 6 digit所以它不能是zero平衡。在我的示例中,我使6 digits paid amount与您的预​​期结果相匹配,但您应该根据需要更正并使用它

DECLARE @sales TABLE(company VARCHAR(50), 
    ref INT, 
    Tag INT, 
    event_date DATE, 
    sale_price INT, 
    Amount  INT,  
    Receipt_No VARCHAR(50), 
    Paid INT, 
    Balance INT)

INSERT INTO @sales VALUES
('PRco Ltd',123,0311,'03-10-2018',610000,610000,'R19A0000761',500000,11000),
('PRco Ltd',123,0311,'03-10-2018',610000,610000,'R19A0000912',110000,0)

SELECT s.company, 
    s.ref, 
    s.Tag, 
    s.event_date,
    MAX(s.sale_price) sale_price,
    MAX(s.amount) amount,
    MAX(s1.receipt) receipt,
    SUM(s.paid) paid,
    (MAX(s.amount)-SUM(s.paid)) balance
FROM @sales s
OUTER APPLY (
            select stuff(
                (select ',' + s1.Receipt_No 
                from @sales s1
                where s1.company = s.company
                AND s1.ref = s.ref
                AND s1.Tag = s.Tag
                AND s1.event_date = s.event_date
                for xml path('')
                )
            , 1, 1, '') receipt
        ) s1
GROUP BY s.company, s.ref, s.Tag, s.event_date

OUTPUT:

company     ref Tag event_date  sale_price  amount  receipt                 paid    balance
PRco Ltd    123 311 2018-03-10  610000      610000  R19A0000761,R19A0000912 610000  0

1
投票

以下查询可帮助您获得所需的结果。创建的示例表供您参考,您可以根据需要使用该视图。填充功能有助于连接收据编号

DECLARE @Payment_Data Table(
    Company VARCHAR(50), 
    Ref INT, 
    Tag INT, 
    Event_date DATE, 
    Sale_price INT, 
    Amount  INT,  
    Receipt_No VARCHAR(50), 
    Paid INT, 
    Balance INT)

INSERT INTO @Payment_Data  VALUES
('PRco Ltd',123,0311,'03-10-2018',610000,610000,'R19A0000761',500000,11000),
('PRco Ltd',123,0311,'03-10-2018',610000,610000,'R19A0000912',110000,0)


SELECT  Company, 
        Ref, 
        Tag, 
        max(Event_date), 
        max(Sale_price),
        MAX(Amount) amount,
        SUM(Paid) paid,
        (MAX(Amount)-SUM(Paid)) Balance,

        Receipt_No = STUFF((
          SELECT ',' + Receipt_No
          FROM @Payment_Data  p2
          WHERE ref = p2.ref
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

    FROM    @Payment_Data  p1
    GROUP BY Company, Ref, Tag

1
投票

它可以像下面这样使用GROUP BY

SELECT s1.company, 
       s1.ref, 
       s1.tag, 
       s1.event_date, 
       max(s1.sale_price)  sale_price, 
       max(s1.amount)  amount, 
       STUFF ((SELECT ', ' + CAST(receipt_no AS varchar(100))
                FROM 
                payment_data pd where pd.ref=s1.ref
                ORDER BY receipt_no
                FOR XML PATH('')
                ),1,2,'' ) AS Receipt_No,
       sum(s1.paid) paid ,
       min(s1.balance) balance
from payment_data s1
group by company,ref,tag,event_date

Online Demo


-2
投票

您可以使用group_concat函数基于Group by进行连接。

SELECT  company, ref, Tag, sale_price, Amount, 
    dbo.GROUP_CONCAT(Receipt_No + ',' ) AS Receipt_No , sum(Paid)
FROM    dbo.foo
GROUP BY company, ref, Tag, event_date, sale_price, Amount
© www.soinside.com 2019 - 2024. All rights reserved.