在SQL Server查询中选择列的多行
我有一个表格,我们称之为案例。案例表格包含案例的基本信息,例如案例编号和案例所有者 在单独的表中,CaseDetails存储了与特定案例相关联的多个电话号码。CaseDetails中的Type列表示电话号码的类型,例如家庭、手机或工作。这两个表是按案例编号链接的 更清楚地说: 案例 案件详情 我希望能够写一个查询,可以收回案件的基本细节,以及所有相关的电话号码 在我的脑海里,我想象着这个查询是这样的在SQL Server查询中选择列的多行,sql,sql-server,Sql,Sql Server,我有一个表格,我们称之为案例。案例表格包含案例的基本信息,例如案例编号和案例所有者 在单独的表中,CaseDetails存储了与特定案例相关联的多个电话号码。CaseDetails中的Type列表示电话号码的类型,例如家庭、手机或工作。这两个表是按案例编号链接的 更清楚地说: 案例 案件详情 我希望能够写一个查询,可以收回案件的基本细节,以及所有相关的电话号码 在我的脑海里,我想象着这个查询是这样的 Select CaseNumber, CaseOwner, Detail w
Select
CaseNumber, CaseOwner,
Detail where Type = 1, Detail where Type = 2, Detail where Type = 3
From
Case
Join
CaseDetails on Case.CaseNumber = CaseDetails.CaseNumber
这样,可以使用type列从CaseDetails表中提取每个单独的细节。但是,这在语法上是不正确的,不会执行
我应该如何构造一个查询来提取这些信息?我似乎无法在谷歌上找到这方面的信息,因为我不确定要搜索什么
这一点的全部意义在于,我可以找到特定案例的所有相关编号,并将它们存储在一个位置
这就是我希望最终输出的样子
CaseNumber CaseOwner Detail1 Detail2 Detail3
-------------------------------------------------------------------
1 Bob 0123456789 1111111111 0000011111
您可以在下面的表达式中使用CASE
Select a.CaseNumber, CaseOwner, max(case when Type = 1 then detail end) as as detail1, max(case when Type = 2 then detail end) as detail2, max(case when Type = 3 then detail end) as detail3
From Case a
Join CaseDetails b on a.CaseNumber = b.CaseNumber
group by a.CaseNumber, CaseOwner
或者您可以使用PIVOT
您可以使用条件聚合:
Select c.CaseNumber, c.CaseOwner,
max(case when cd.type = 1 then cd.Detail end) as detail_1,
max(case when cd.type = 2 then cd.Detail end) as detail_2,
max(case when cd.type = 3 then cd.Detail end) as detail_3
From Case c Join
CaseDetails cd
on c.CaseNumber = cd.CaseNumber
group by c.CaseNumber, c.CaseOwner;
编辑:
也可以使用外部应用来执行此操作:
尝试:
使用枢轴
select CaseNumber,CaseOwner,
[1] as detail1,
[2] as detail2 ,
[3] as detail3
from
(select c1.CaseNumber,c1.CaseOwner,c2.Detail,c2.Type
From Case c1
Join CaseDetails c2
on c1.CaseNumber = c2.CaseNumber
) src
PIVOT
(
max(Detail) for Type in ([1],[2],[3])
) pvt
好的,我已经设法使它在一个单独的情况下工作,但是在我实现这段代码的实际查询中,我有大量select语句从10多个表中选择数据。我必须在GROUPBY子句中包含每个选定列吗?@Jake12342134。不,但只能回答你实际提出的问题。我建议你问另一个问题,更好地了解你想要完成什么-如果编辑不能满足你的需要。为什么在这个场景中使用max?@Jake12342134。没有特别的原因。我猜这些类型没有重复。需要进行一些聚合,max和min将返回相同的结果。Pivot是您的最佳选择,因为它利用了您已经保存的列[type],这正是您实际需要的。记住这会让你进入最后一排问题;你从那里走到哪里完全取决于你,即问另一个问题等。
with cte as
(
Select a.CaseNumber, CaseOwner, type, detail
From Case a
Join CaseDetails b on a.CaseNumber = b.CaseNumber
group by a.CaseNumber, CaseOwner
)
select casenumber, caseowner,pv.*
from cte pivot(max(detail) for type in (1,2,3)) as pv
Select c.CaseNumber, c.CaseOwner,
max(case when cd.type = 1 then cd.Detail end) as detail_1,
max(case when cd.type = 2 then cd.Detail end) as detail_2,
max(case when cd.type = 3 then cd.Detail end) as detail_3
From Case c Join
CaseDetails cd
on c.CaseNumber = cd.CaseNumber
group by c.CaseNumber, c.CaseOwner;
select c.*, cd.*
from case c outer apply
(select max(case when cd.type = 1 then cd.Detail end) as detail_1,
max(case when cd.type = 2 then cd.Detail end) as detail_2,
max(case when cd.type = 3 then cd.Detail end) as detail_3
from CaseDetails cd
where c.CaseNumber = cd.CaseNumber
) cd;
Select a.CaseNumber, a.CaseOwner,
min(CASE WHEN b.Type = 1 IS NOT NULL THEN b.Detail END) as 'Detail1',
min(CASE WHEN b.Type = 2 IS NOT NULL THEN b.Detail END) as 'Detail2',
min(CASE WHEN b.Type = 3 IS NOT NULL THEN b.Detail END) as 'Detail3'
From Case a
Join CaseDetails b
on a.CaseNumber = b.CaseNumber
GROUP BY a.CaseNumber, a.CaseOwner
select CaseNumber,CaseOwner,
[1] as detail1,
[2] as detail2 ,
[3] as detail3
from
(select c1.CaseNumber,c1.CaseOwner,c2.Detail,c2.Type
From Case c1
Join CaseDetails c2
on c1.CaseNumber = c2.CaseNumber
) src
PIVOT
(
max(Detail) for Type in ([1],[2],[3])
) pvt