SQL case语句-3子句?
希望有人能帮上忙 我有一张看起来像下图的桌子SQL case语句-3子句?,sql,sql-server,tsql,string-concatenation,Sql,Sql Server,Tsql,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 注意Pam有两行,因为她有两种不同类型的服务 我如何写一个案例陈述,说明姓名栏中的人是否拥有服务3、服务4或两者兼有 例如
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
注意Pam有两行,因为她有两种不同类型的服务
我如何写一个案例陈述,说明姓名栏中的人是否拥有服务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
一如既往地谢谢大家诸如此类的事情
编辑:添加了“不同”以避免出现3、4和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 |
+----+------+-----+---------+----------+--------------------+
| 67 | Bob | 22 | 11 | 4 | 4 |
+----+------+-----+---------+----------+--------------------+
如果只想添加以下内容,则此查询为:
如果你真的只有两个服务3和4,而且同一个人不可能拥有相同的服务两次,那么我会使用
select *, case when (count(*) over (partition by name)) = 2 then '3 & 4'
else cast(services as varchar) + ' Only' end
from t
试试这个
SELECT
*,
SG = CASE Q.Cnt
WHEN 1 THEN '3 & 4'
ELSE CAST(T1.[Services] AS VARCHAR(10))+' Only' END
FROM YourTable T1
OUTER APPLY
(
SELECT
Cnt = COUNT(DISTINCT Srv)
FROM YourTable T2
WHERE t2.Id = t1.Id
AND t2.[Services] IN (3,4)
AND t2.[Services] <> t1.[Services]
)Q
请试试这个--
注意:使用CHARINDEX在末尾添加“仅”文本
输出
如果您使用的是MS SQL2017,那么这个应该可以做到:
WITH A AS
(
SELECT
ID, Name, Age, GroupID,
STRING_AGG (Services, ' & ')
FROM yourtable
GROUP BY ID, Name, Age, GroupID
)
SELECT DISTINCT
A.ID, A.Name, A.Age, B.Services,
CASE
WHEN LEN(A.SG) = 1 THEN A.SG + ' Only'
ELSE A.SG
END AS SG
FROM yourtable AS B
LEFT JOIN A
ON A.ID = B.ID
我们可以假设某人属于3,回报应该是3、4和5吗?这意味着您需要引入一种方法,以避免在返回的数据集中出现虚构的单词。这并不是SQL Server的forté。如果您有两个条目用于具有相同服务的同一个人,则不会返回预期结果。假设我有两次Id 1和服务3的条目,但没有服务4,它仍然会说3&4@JayasuryaSatheesh没错,我已经更新了答案。谢谢。在这种情况下,他只需要3和4,这是我能想到的最简单的方法,但很明显,这应该是工作量所承载的实际值……我不相信distinct是个好主意。如果多次使用相同的服务,这可能会反映在输出中。但希望id和服务的组合有一个独特的约束。
SELECT
*,
SG = CASE Q.Cnt
WHEN 1 THEN '3 & 4'
ELSE CAST(T1.[Services] AS VARCHAR(10))+' Only' END
FROM YourTable T1
OUTER APPLY
(
SELECT
Cnt = COUNT(DISTINCT Srv)
FROM YourTable T2
WHERE t2.Id = t1.Id
AND t2.[Services] IN (3,4)
AND t2.[Services] <> t1.[Services]
)Q
;WITH CTE1 AS
(
select 33 id , 'Pam' Name , 34 Age , 334 GroupBy , 3 Services
union all
select 33 , 'Pam' , 34 , 334 , 4
union all
select 43 , 'Lily' , 56 , 10 , 3
union all
select 67 , 'Bob' , 22 , 11 , 4
)
,CTE2 AS
(
SELECT * ,
STUFF
((
SELECT CONCAT(' & ' , Services ) Services
FROM CTE1 a
WHERE ( a.id = b.id )
FOR XML PATH(''),Type
).value('.','VARCHAR(MAX)') ,1,2,'')
AS SG
FROM CTE1 b
)
SELECT Id,Name,Age,GroupBy,Services , CASE WHEN CHARINDEX('&',SG,0) = 0 THEN CONCAT(SG,' Only') ELSE SG END SG
FROM CTE2
Id Name Age GroupBy 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
(4 rows affected)
WITH A AS
(
SELECT
ID, Name, Age, GroupID,
STRING_AGG (Services, ' & ')
FROM yourtable
GROUP BY ID, Name, Age, GroupID
)
SELECT DISTINCT
A.ID, A.Name, A.Age, B.Services,
CASE
WHEN LEN(A.SG) = 1 THEN A.SG + ' Only'
ELSE A.SG
END AS SG
FROM yourtable AS B
LEFT JOIN A
ON A.ID = B.ID