SQL存储过程,将行与派生变量合并

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

我已经离开了一段时间,需要帮助,这可能是一个简单的解决方案,但目前我很困。我有这个选择语句,需要将同一部门的行与相似元素组合在一起,但是group by将有一个很大的选择列表,还有像MERGE这样的其他方式吗?这是我正在处理的sql stmt及其输出:

SELECT distinct sg.Description as 'Groups', si.Store_Name, a.Store_ID, si.Store_ID1 as 'Store #2', d.Department_ID as 'Dept', a.Vendor_ID,
 IIF(d.Delivery_Day = 1, dbo.DayOfWeekToString(d.Order_Day),null) as 'Sun',
 IIF(d.Delivery_Day = 1, CONCAT(CONVERT(varchar, d.Deadline_Hour) , ':', RIGHT('00' + CONVERT(varchar, d.Deadline_Minute), 2)) ,null ) as 'time',
 IIF(d.Delivery_Day = 2, dbo.DayOfWeekToString(d.Order_Day),null) as 'Mon',
 IIF(d.Delivery_Day = 2, CONCAT(CONVERT(varchar, d.Deadline_Hour) , ':', RIGHT('00' + CONVERT(varchar, d.Deadline_Minute), 2)) ,null ) as 'time',
 IIF(d.Delivery_Day = 3, dbo.DayOfWeekToString(d.Order_Day),null) as 'Tue',
 IIF(d.Delivery_Day = 3, CONCAT(CONVERT(varchar, d.Deadline_Hour) , ':', RIGHT('00' + CONVERT(varchar, d.Deadline_Minute), 2)) ,null ) as 'time',
 IIF(d.Delivery_Day = 4, dbo.DayOfWeekToString(d.Order_Day),null) as  'Wed',
 IIF(d.Delivery_Day = 4, CONCAT(CONVERT(varchar, d.Deadline_Hour) , ':', RIGHT('00' + CONVERT(varchar, d.Deadline_Minute), 2)) ,null ) as 'time',
 IIF(d.Delivery_Day = 5, dbo.DayOfWeekToString(d.Order_Day),null) as  'Thu',
 IIF(d.Delivery_Day = 5, CONCAT(CONVERT(varchar, d.Deadline_Hour) , ':', RIGHT('00' + CONVERT(varchar, d.Deadline_Minute), 2)) ,null ) as 'time',
 IIF(d.Delivery_Day = 6, dbo.DayOfWeekToString(d.Order_Day),null) as  'Fri',
 IIF(d.Delivery_Day = 6, CONCAT(CONVERT(varchar, d.Deadline_Hour) , ':', RIGHT('00' + CONVERT(varchar, d.Deadline_Minute), 2)) ,null ) as 'time',
 IIF(d.Delivery_Day = 7, dbo.DayOfWeekToString(d.Order_Day),null)  as  'Sat',
 IIF(d.Delivery_Day = 7, CONCAT(CONVERT(varchar, d.Deadline_Hour) , ':', RIGHT('00' + CONVERT(varchar, d.Deadline_Minute), 2)),null) as 'time'
 from Delivery_Schedule_Header a  Join Vendor_Info b ON (a.Vendor_ID = b.Vendor_ID) Join Delivery_Schedule_Detail d  on d.UID_Delivery = a.UID 
 Join Store_Info si on si.Store_ID = a.Store_ID Join Store_Group sg  on sg.GroupStore_UID = si.GroupStore_UID 
Where a.Vendor_ID = @Vendor_Id and si.GroupStore_UID = Case when @Group_Id = -1 then si.GroupStore_UID else @Group_Id end

和结果:

Groups  Store_Name  Store_ID    Store #2    Dept    Vendor_ID   Sun time    Mon time    Tue time    Wed time    Thu time    Fri time    Sat time
Balls   Price Chopper 18                18  18  3200    70038000    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    Wednesday   11:00   NULL    NULL    NULL    NULL
Balls   Price Chopper 18                18  18  3200    70038000    NULL    NULL    NULL    NULL    Monday  11:00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
Balls   Price Chopper 18                18  18  3200    70038000    Saturday    11:00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL

这三行需要在同一部门下合并抱歉,如果这只是基本知识,但是我已经离开这种工作一段时间了,需要复习。谢谢

sql group-by merge
1个回答
0
投票

您需要有条件的聚合:

SELECT 
    sg.Description as Groups, 
    si.Store_Name, 
    a.Store_ID, 
    si.Store_ID1 as Store_2, 
    d.Department_ID as Dept, 
    a.Vendor_ID,
    MAX(CASE WHEN d.Delivery_Day = 1 THEN dbo.DayOfWeekToString(d.Order_Day) END) as Sun,
    MAX(CASE 
        WHEN d.Delivery_Day = 1 
        THEN CONCAT(CONVERT(varchar, d.Deadline_Hour) , ':', RIGHT('00' + CONVERT(varchar, d.Deadline_Minute), 2))
    ) as time
    ...
FROM Delivery_Schedule_Header a  
JOIN Vendor_Info b               ON a.Vendor_ID = b.Vendor_ID
JOIN Delivery_Schedule_Detail d  ON d.UID_Delivery = a.UID 
JOIN Store_Info si               ON si.Store_ID = a.Store_ID 
JOIN Store_Group sg              ON sg.GroupStore_UID = si.GroupStore_UID 
WHERE 
    a.Vendor_ID = @Vendor_Id 
    AND si.GroupStore_UID = CASE WHEN @Group_Id = -1 THEN si.GroupStore_UID ELSE @Group_Id END
GROUP BY 
    sg.Description as Groups, 
    si.Store_Name, 
    a.Store_ID, 
    si.Store_ID1 as Store_2, 
    d.Department_ID as Dept, 
    a.Vendor_ID
© www.soinside.com 2019 - 2024. All rights reserved.