Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server查询中选择列的多行_Sql_Sql Server - Fatal编程技术网

在SQL Server查询中选择列的多行

在SQL Server查询中选择列的多行,sql,sql-server,Sql,Sql Server,我有一个表格,我们称之为案例。案例表格包含案例的基本信息,例如案例编号和案例所有者 在单独的表中,CaseDetails存储了与特定案例相关联的多个电话号码。CaseDetails中的Type列表示电话号码的类型,例如家庭、手机或工作。这两个表是按案例编号链接的 更清楚地说: 案例 案件详情 我希望能够写一个查询,可以收回案件的基本细节,以及所有相关的电话号码 在我的脑海里,我想象着这个查询是这样的 Select CaseNumber, CaseOwner, Detail w

我有一个表格,我们称之为案例。案例表格包含案例的基本信息,例如案例编号和案例所有者

在单独的表中,CaseDetails存储了与特定案例相关联的多个电话号码。CaseDetails中的Type列表示电话号码的类型,例如家庭、手机或工作。这两个表是按案例编号链接的

更清楚地说:

案例

案件详情

我希望能够写一个查询,可以收回案件的基本细节,以及所有相关的电话号码

在我的脑海里,我想象着这个查询是这样的

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