Данные отображаются по списку, когда группа по не включает данные - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть такая команда sql

select mainPOID.EstAPDate,mainPOID.POID,TTm.ID,TTMAmount=TTMD.InvoiceAmount
From TTBeforeMms TTM
inner join  TTBeforeMms_Detail TTMD   on TTM.ID = TTMD.ID
inner join (
select  distinct main.EstAPDate,main_D.POID
From AP main
left join  AP_Detail  main_D on main.ID = main_D.ID
where  main.Type ='PA' and  main.EstAPDate between '2018/6/01' AND '2018/6/15' and  left(main_D.InvoiceNo,4) != '1111' ) mainPOID on TTMD.poid =mainPOID.POID and TTM.EstAPdate<=mainPOID.EstAPdate and  mainPOID.POID='CM3PU18030009'
order by mainPOID.EstAPDate,mainPOID.POID

sql результат понравится

enter image description here

Мой вопрос Как данные могут отображаться по списку, если группа по не включает данные?

Например

ID будет отображаться по списку Когда я группирую по EstAPDate 、 POID и сумма (TTMAmount)

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы можете хранить в одной временной таблице или использовать CTE

CREATE TABLE [dbo].#Columnss(
    espapdate date   ,
    poid  varchar(max),
    id  varchar(max),amount decimal(22,6))

GO
insert into #Columnss values('2018-06-15','cm3','pt20',19988.8900)
insert into #Columnss values('2018-06-15','cm3','pt21',265.8900)

    SELECT 
    REPLACE(ESPAPDATE,'-','/') ESPAPDATE, POID,
    STUFF(
        (SELECT ' , ' + OD.ID 
        FROM #COLUMNSS OD 
        WHERE OD.ESPAPDATE = O.ESPAPDATE
        AND  OD.POID = O.POID
        FOR XML PATH('')), 1, 2, ''
    ) PRODUCTNAMES,SUM(AMOUNT)AMOUNT
FROM #COLUMNSS O 
GROUP BY ESPAPDATE, POID

выход

   espapdate    poid    ProductNames    amount
    2018/06/15  cm3     pt20 , pt21     20254.780000
0 голосов
/ 10 сентября 2018

Есть множество примеров CSV, использующих FOR XML PATH. Для вашего случая я обертываю ваш существующий запрос в CTE, а затем генерирую строку CSV для идентификатора

; with 
cte as
(
select      mainPOID.EstAPDate, mainPOID.POID, TTm.ID, TTMAmount=TTMD.InvoiceAmount
From        TTBeforeMms TTM
inner join  TTBeforeMms_Detail TTMD   on TTM.ID = TTMD.ID
inner join  (
                select  distinct main.EstAPDate,main_D.POID
                From    AP main
                     left join  AP_Detail  main_D on main.ID = main_D.ID
                 where  main.Type ='PA' 
                 and    main.EstAPDate between '2018/6/01' AND '2018/6/15' 
                 and    left(main_D.InvoiceNo,4) != '1111' 
            ) mainPOID  on TTMD.poid      = mainPOID.POID 
                       and TTM.EstAPdate <= mainPOID.EstAPdate 
                       and mainPOID.POID  = 'CM3PU18030009'
)
SELECT  EstAPDate, POID, 
        ID = STUFF(c.ID, 1, 1, ''),
        TTMAmount = SUM(TTMAmount)
FROM    cte 
        CROSS APPLY
        (
            SELECT ',' + ID
            FROM   cte x
            WHERE  x.EstAPDate = cte.EstAPDate
            AND    x.POID      = cte.POID
            FOR XML PATH ('')
        ) c (ID)
GROUP BY EstAPDate, POID
ORDER BY EstAPDate, POID
...