Sql 从列中以逗号分隔天名称

Sql 从列中以逗号分隔天名称,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张结构如下的桌子 我想得到这样的结果 请指导我如何通过查询获得此结果。我尝试使用大小写表达式,但它无法连接字符串 CASE WHEN EveryDay=1 THEN @Days ='Every Day' WHEN SUN=1 THEN @Days = 'SUNDAY' 这应该会让你大开眼界: SELECT CASE EveryDay WHEN 1 THEN 'Everyday' ELSE STUFF(CONCAT(',' + CASE SUN W

我有一张结构如下的桌子

我想得到这样的结果

请指导我如何通过查询获得此结果。我尝试使用大小写表达式,但它无法连接字符串

CASE WHEN EveryDay=1 THEN @Days ='Every Day' WHEN SUN=1 THEN @Days = 'SUNDAY'

这应该会让你大开眼界:

SELECT CASE EveryDay WHEN 1 THEN 'Everyday'
                     ELSE STUFF(CONCAT(',' + CASE SUN WHEN 1 THEN 'SUN' END,
                                       ',' + CASE MON WHEN 1 THEN 'MON' END,
                                       ...
                                       ',' + CASE SAT WHEN 1 THEN 'SAT' END),1,1,'')
       END
FROM ...

Larnu已经给了你一个很好的答案,但是如果SendSms=0,它将每天返回。因此,我张贴这个答案来涵盖它

SELECT *,
IIF(SendSms = 1, 
    IIF(EveryDay = 1, 'EveryDay',
        STUFF(CONCAT(CASE WHEN Sun = 1 THEN ',Sunday' END,
                     CASE WHEN Mon = 1 THEN ',Monday' END,
                     CASE WHEN Tue = 1 THEN ',Tuesday' END,
                     CASE WHEN Wed = 1 THEN ',Wednesday' END,
                     CASE WHEN Thu = 1 THEN ',Thuresday' END,
                     CASE WHEN Fri = 1 THEN ',Friday' END,
                     CASE WHEN Sat = 1 THEN ',Saturday' END
                    ), 1, 1, ''
             )
        )
    , 'No SMS') Days
FROM
(
  VALUES
  (1, 1, 0, 1, 0, 0, 1, 0, 0, 0),
  (2, 1, 1, 0, 0, 0, 0, 0, 0, 0),
  (3, 0, 1, 0, 0, 0, 0, 0, 0, 1)
) T(ID, SendSms, EveryDay, Sun, Mon, Tue, Wed, Thu, Fri, Sat)

在SQL Server 2017中,您可以使用函数使其稍微简单一些:

SELECT CASE WHEN EveryDay = 1 THEN 'EveryDay'
            ELSE CONCAT_WS(
                     ',', 
                     CASE WHEN SUN = 1 THEN 'Sunday'    END, 
                     CASE WHEN MON = 1 THEN 'Monday'    END, 
                     CASE WHEN TUE = 1 THEN 'Tuesday'   END, 
                     CASE WHEN WED = 1 THEN 'Wednesday' END, 
                     CASE WHEN THU = 1 THEN 'Thursday'  END, 
                     CASE WHEN FRI = 1 THEN 'Friday'    END, 
                     CASE WHEN SAT = 1 THEN 'Saturday'  END
                 )
       END AS Days

请将示例数据以格式化文本而不是图像的形式发布。Alized to OP正在尝试将列转换为分隔的,而不是行。虽然我确信它们确实存在,但实际上找不到dup。如果SendSMS=0怎么办?您使用的是哪个版本的SQL Server?我忘了他们在2017年引入了这个版本。谢谢你的提醒。