我遇到了一个要求,需要一些专家意见。
要求
员工将拥有3种类型的手机类型,如Home,Pager,Cell。我有一个名为 EmpPhone 的表格,每当在UI中输入电话号码时,这将存储在不同的行中。
因此,如果我服用EmpID = 744,目前他有4个电话号码(查看图片)
早些时候我们不确定UI是否可以处理相同类型的电话号码,在这种情况下它的Type = 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,并将其添加到了join,work。
答案 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
输出现在如下