如何在SQL中的逗号分隔行中存储列值

时间:2017-12-08 11:13:09

标签: sql-server

我遇到了一个要求,需要一些专家意见。

要求

员工将拥有3种类型的手机类型,如Home,Pager,Cell。我有一个名为 EmpPhone 的表格,每当在UI中输入电话号码时,这将存储在不同的行中。

因此,如果我服用EmpID = 744,目前他有4个电话号码(查看图片)

enter image description here

早些时候我们不确定UI是否可以处理相同类型的电话号码,在这种情况下它的Type = 0.我能够将这3行数据移动到单行,这就是我需要的。

enter image description here

这里是我卡住的地方,因为UI可以包含任意数字的多种电话类型,当前数据只显​​示第一个数据并隐藏其他数据,因此我需要输入0号电话号码才能容纳单个 HomePhone 细胞。

我甚至浏览过并且能够在单个单元格中获取值,但是我无法在实际存储过程中实现相同的代码。

这就是我所知道的

DECLARE @HomePhoneNumbers varchar(MAX)
SET @HomePhoneNumbers = ''
SELECT @HomePhoneNumbers = @HomePhoneNumbers + CONVERT(varchar, PhoneNumber) 
+ ',' 
FROM EmpPhone
where EmployeeID=744 and EmpPhone.Type =0

-- Remove last comma
SELECT LEFT(@HomePhoneNumbers, LEN(@HomePhoneNumbers) - 1) 

这给了我我需要的东西 enter image description here

如果你观察代码我有硬编码的employeeID,我不能实际的StorProc,因为EmployeeID没有作为参数传递。这是我的示例代码段。

SELECT
    ,MAX(CASE WHEN EmpPhone.Type = 0 THEN ISNULL(EmpPhone.PhoneNumber,'') END) HomePhone
    ,MAX(CASE WHEN EmpPhone.Type = 2 THEN ISNULL(EmpPhone.PhoneNumber,'') END) Cell
    ,MAX(CASE WHEN EmpPhone.Type = 5 THEN ISNULL(EmpPhone.PhoneNumber,'') END) Pager
    ,E.EmployeeID

    From 
    //JOINING FEW TABLES

如果我足够清楚,请告诉我。

猜猜没有CTE我实施了什么,但你的回答帮我解决了:)

SELECT
EmployeeID,
Type,
STUFF(
    (
    SELECT
        ', ' + PhoneNumber
    FROM EmpPhone E
    WHERE E.EmployeeID = T.EmployeeID AND E.Type = T.Type
    FOR XML PATH(''),TYPE
    ).value('.','VARCHAR(MAX)'
    ), 1, 1, ''
) AS Phones
INTO #PhoneNumbers
    FROM EmpPhone AS T
    GROUP BY EmployeeID, Type

    Select
    ,MAX(CASE WHEN PH.Type = 0 THEN ISNULL(PH.Phones,'') END) HomePhone
    ,MAX(CASE WHEN PH.Type = 2 THEN ISNULL(PH.Phones,'') END) Cell
    ,MAX(CASE WHEN PH.Type = 5 THEN ISNULL(PH.Phones,'') END) Pager

我刚刚使用了temptable,并将其添加到了join,work。

1 个答案:

答案 0 :(得分:1)

据我了解,您需要将concatenate string using SQL来自不同的行转换为单个值 请检查referrred教程并尝试遵循SQL Select语句

SELECT
    EmployeeID,
    Type,
    STUFF(
        (
        SELECT
            ', ' + PhoneNumber
        FROM EmpPhone e
        WHERE e.EmployeeID = t.EmployeeID and
              e.Type = t.Type
        FOR XML PATH(''),TYPE
        ).value('.','VARCHAR(MAX)'
        ), 1, 1, ''
    ) As Phones
FROM EmpPhone as t
Group By EmployeeID, Type

我希望它有所帮助

参考您的第一条评论,我将上述查询修改为CTE表达式,并添加了一个聚合逻辑,如下所示

;with cte as (
SELECT
    EmployeeID,
    Type,
    STUFF(
        (
        SELECT
            ', ' + PhoneNumber
        FROM EmpPhone e
        WHERE e.EmployeeID = t.EmployeeID and
              e.Type = t.Type
        FOR XML PATH(''),TYPE
        ).value('.','VARCHAR(MAX)'
        ), 1, 1, ''
    ) As Phones
FROM EmpPhone as t
Group By EmployeeID, Type
)
select
    EmployeeID,
    MAX(case when type = 0 then phones end) as 'HOME',
    MAX(case when type = 2 then phones end) as 'PAGER',
    MAX(case when type = 5 then phones end) as 'CELL'
from cte
group by 
    EmployeeID

输出现在如下

enter image description here