Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL case语句-3子句?_Sql_Sql Server_Tsql_String Concatenation - Fatal编程技术网

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