SQL案例陈述 - 3条款?

Jes*_*766 2 sql t-sql sql-server string-concatenation

希望有人可以帮助解决这个问题

我有一张如下所示的表格

ID | Name | Age | GroupID | Services
33 | Pam  | 34  |  334    |   3
33 | Pam  | 34  |  334    |   4
43 | Lily | 56  |  10     |   3
67 | Bob  | 22  |  11     |   4
Run Code Online (Sandbox Code Playgroud)

请注意Pam有2行,因为她有2种不同类型的服务.

我将如何编写一个案例陈述,该陈述将显示"名称"列中的人是否具有服务3,服务4或两者.

例如,查询上面的输出就是

 ID | Name | Age | GroupID | Services | SG
    33 | Pam  | 34  |  334    |   3   | 3 & 4
    33 | Pam  | 34  |  334    |   4   | 3 & 4
    43 | Lily | 56  |  10     |   3   | 3 Only
    67 | Bob  | 22  |  11     |   4   | 4 Only
Run Code Online (Sandbox Code Playgroud)

一如既往地谢谢大家

Shn*_*ugo 7

像这样的东西?

编辑:添加DISTINCT以避免案例3 & 4 & 4

DECLARE @mockupTable TABLE(ID INT,Name VARCHAR(100),Age INT, GroupID INT,[Services] INT);
INSERT INTO @mockupTable VALUES
  (33,'Pam',34,334,3)
 ,(33,'Pam',34,334,4)
 ,(43,'Lily',56,10,3)
 ,(67,'Bob',22,11,4);

 SELECT t.*
       ,STUFF((
            SELECT DISTINCT ' & ' + CAST(x.[Services] AS VARCHAR(10))
            FROM @mockupTable AS x
            WHERE t.ID=x.ID 
            ORDER BY x.[Services]
            FOR XML PATH(''),TYPE
        ).value('.','nvarchar(max)'),1,3,'') AS SG
 FROM @mockupTable AS t;
Run Code Online (Sandbox Code Playgroud)

结果

+----+------+-----+---------+----------+--------------------+
| ID | Name | Age | GroupID | Services | SG                 |
+----+------+-----+---------+----------+--------------------+
| 33 | Pam  | 34  | 334     | 3        | 3 & 4              |
+----+------+-----+---------+----------+--------------------+
| 33 | Pam  | 34  | 334     | 4        | 3 & 4              |
+----+------+-----+---------+----------+--------------------+
| 43 | Lily | 56  | 10      | 3        | 3                  |
+----+------+-----+---------+----------+--------------------+
| 67 | Bob  | 22  | 11      | 4        | 4                  |
+----+------+-----+---------+----------+--------------------+
Run Code Online (Sandbox Code Playgroud)

如果要添加以下内容,则为查询only:

SELECT t.*
        ,STUFF((
            SELECT DISTINCT ' & ' + CAST(x.[Services] AS VARCHAR(10))
            FROM @mockupTable AS x
            WHERE t.ID=x.ID 
            ORDER BY x.[Services]
            FOR XML PATH(''),TYPE
        ).value('.','nvarchar(max)'),1,3,'') 
        + CASE WHEN COUNT(*) OVER(PARTITION BY ID) = 1 THEN ' Only' ELSE '' END AS SG
    FROM @mockupTable AS t;
Run Code Online (Sandbox Code Playgroud)