SQL案例陈述 - 3条款?

时间:2018-01-25 09:35:39

标签: 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有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

一如既往地谢谢大家

5 个答案:

答案 0 :(得分: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;

结果

+----+------+-----+---------+----------+--------------------+
| 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                  |
+----+------+-----+---------+----------+--------------------+

如果您要添加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;

答案 1 :(得分:0)

如果你真的只有两个服务3和4,并且同一个人有两次相同的服务永远不会发生,那么我会使用

tmpValue

dbfiddle demo

答案 2 :(得分:0)

试试这个

console.log(event.currentTarget.id);

答案 3 :(得分:0)

请试试这个---

注意 - 使用CHARINDEX在末尾添加“仅”文字。

;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)

答案 4 :(得分:0)

如果您正在使用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