【问题标题】:Can I use a WHILE loop inside a SQL SELECT Query我可以在 SQL SELECT 查询中使用 WHILE 循环吗
【发布时间】:2018-08-07 10:39:43
【问题描述】:

我需要从两个不具有相同元素数的表的 SQL 查询中创建包含偶数列的格式化文本 (CSV) 输出。我似乎无法将数据填充到所需的列数。

样本数据

table Students(id, name)
values
    (1, Alex),
    (2, Bob),
    (3, Charlie),
    (4, David)

table Hobbies (studentId, hobby)
values
    (2,'skating')
    (2,'sailing')
    (3,'reading')
    (4,'video games')
    (4,'paintball')
    (4,'nascar')
    (4,'baseball')

期望的输出

[ID][OutputString]
[0][Student,Hobby1,Hobby2,Hobby3,Hobby4]
[1][Alex,,,,]
[2][Bob,skating,sailing,]
[3][Charlie,reading,,,]
[4][David,video games,paintball,nascar,baseball]

损坏的伪代码

DECLARE @maxHobbies INT = 4;
DECLARE @hobbyCount INT = 1;

DECLARE headerString varchar(max) = 'Student';
WHILE @hobbyCount <= @maxHobbies
BEGIN
    set @headerString = @headerString + ',Hobby' + @hobbyCount
    @hobbyCount = @hobbyCount + 1
END

DECLARE @outputString varchar(max)
SET @outputString = concat(@headerSting, char(13)) +
SELECT 0 AS ID, @headerString AS OutputString
UNION 
SELECT
    id,
    name + (WHILE @hobbyCount <= @maxHobbies BEGIN
        (CASE
            WHEN EXISTS SELECT hobby FROM Hobbies where studentId = Students.id
            THEN ',' + SELECT hobby FROM Hobbies where studentId = Students.id
            ELSE ','
        END)
    END)
FROM Students

【问题讨论】:

    标签: sql sql-server select while-loop union


    【解决方案1】:

    您最多需要 4 个爱好。您可以使用条件聚合来做到这一点:

    select s.id,
           (s.name + ',' +
            max(case when seqnum = 1 then h.hobby else '' end) + ',' +
            max(case when seqnum = 2 then h.hobby else '' end) + ',' +
            max(case when seqnum = 3 then h.hobby else '' end) + ',' +
            max(case when seqnum = 4 then h.hobby else '' end)
           ) as outputstring
    from students s left join
         (select h.*,
                 row_number() over (partition by h.studentid order by (select null)) as seqnum
          from hobbies h
         ) h
         on h.studentid = s.id
    group by s.id, s.name;
    

    【讨论】:

    • 这是一个很好的解决方案。但它是否可以扩展到可变的最大子类别数,可能高达 100 个,而对最大范围没有硬性限制?
    • @OfficeDev 。 . .什么子类?表中没有这样的列。
    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2023-04-03
    • 2011-02-24
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多