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

曼朱博伊兹

我坚持一项要求,需要一些专家意见。

要求

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

所以如果我取 EmpID = 744,目前他有 4 个电话号码(查看图片)

在此处输入图片说明

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

在此处输入图片说明

这就是我卡住的地方,因为 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) 

这给了我我需要的东西 在此处输入图片说明

如果您观察代码,我已经硬编码了 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 并将其添加到连接中,工作。

埃拉珀

据我了解,您需要使用来自不同行的SQL字符串连接成单个值请查看参考教程并尝试遵循 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

现在的输出如下

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从逗号分隔的varchar列SQL中查找int值

Oracle SQL-如何在用逗号分隔的值的列中查找匹配项?

如何获取行值作为逗号或分号分隔的值作为 sql 中的输出

如何在SQL中选择列值作为逗号分隔值字符串

SQL - 如何在 where 子句中使用逗号分隔的列值

如何在SQL Server中替换逗号分隔的字符串列中的值

如何在PostgreSQL中逐行存储逗号分隔的值

如何在sql中以逗号分隔值输出项目符号类型

如何在Oracle SQL中传递多个值(逗号分隔)单个变量

如何使用SQL获取单列中以逗号分隔的值

如何在变量中存储固定行值-SQL Server

将字段中存储的逗号分隔值转换为 SQL Server 中的列

如何在一列SQL中存储多个值

如何在变量中获取行并用逗号分隔值?

如何使用 SQL 查询查看带有 group by 子句的逗号分隔字符串中的列值?

如何使用 MS SQL 以逗号分隔列

如何在列sql server中显示行值?

sql server中单列中多列的逗号分隔值

选择逗号分隔值sql存储过程

在SQL Server中以逗号分隔的值与总和的行

从SQL Server中的逗号分隔列值透视

如何在新行中将R中的逗号分隔值分隔开?

如何根据列中逗号分隔值的数量复制熊猫数据框中的行

如何在C#中的表中存储逗号分隔的值

SQL如何基于逗号分隔的其他子字符串位置返回列值

如何使用SQL将列数据转换为逗号分隔值的行数据

如何将逗号分隔的值获取到 SQL Server 中的新记录中?

如何从sql中逗号分隔的字符串中删除_符号后的值?

如何在SQL Server中使用XPath和XQuery使XML值逗号分隔