我坚持一项要求,需要一些专家意见。
要求
员工将拥有 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] 删除。
我来说两句