SQL 问题:如何将多个结果转换为单行?

Posted

技术标签:

【中文标题】SQL 问题:如何将多个结果转换为单行?【英文标题】:SQL question : How do I pivot mutiple results to single row? 【发布时间】:2009-11-02 16:05:51 【问题描述】:

我有一个数据库名称为“列车延迟,有列”的表

train number(int),
DelayTime(int),
DelayReason(nchar)

因此火车可能因每个延误原因而有多个延误时间,例如:

trainnumber,Delaytime,DelayReason
1          ,5 sec    ,x
1          ,10 sec    ,Z
1          ,70 sec    ,TY

我想创建一个具有以下设计的水晶报表:

trainnumber, delaytime 1,delay reason 1 ,delaytime 2, delay reason 2,delaytime 3,delay reason 3

但我不知道会得到这个结果的查询。

我试过这个:

select delaytime from dbo.traindelay

但输出看起来像这样:

Delaytime
5
10
70

我不希望那样。我想要这样的东西:

delaytime1 ,delaytime2 ,delaytime3 

【问题讨论】:

每趟火车总是会出现三个延误吗?有没有可能有些火车永远不会晚点?而其他人可能会更频繁地延迟? thnx tvanfoson 进行编辑,但我想要答案:D:D @APC 我可能根本没有 dalays 或者它可能是 1 或 2 或 3 但不超过 3 延迟 thnx 【参考方案1】:

首先,我将通过添加一个名为 Id 的列来提出一个新结构,因此现在您有 2 个表:

火车(int Id,字符串名称) TrainDelay (int Id, int TrainId, int DelayTime, nchar DelayReason

每列火车最多延迟 3 次的 SQL 查询是:

select 
  t.Name, 
  d1.DelayTime   as Delay1, 
  d1.DelayReason as Reason1,
  d2.DelayTime   as Delay2, 
  d2.DelayReason as Reason2,
  d3.DelayTime   as Delay3, 
  d3.DelayReason as Reason3,
from Train as t
left join TrainDelay as d1 on d1.TrainId = t.Id 
left join TrainDelay as d2 on d2.TrainId = t.Id and d2.Id > d1.Id
left join TrainDelay as d3 on d3.TrainId = t.Id and d3.Id > d2.Id

请注意,如果您在同一列火车上出现超过 3 次延误,那么每列火车都会有多个结果且记录重复。您可以添加更多连接,但如果您的表很大,它会变得非常慢。

【讨论】:

它的工作原理非常感谢你,但我想问另一件事我想显示像这样的水晶报告我在数据库中有 11 个静态原因,我想让它看起来像表格,例如原因1,原因 2,原因 3 delay1 0 , 5 , 6 delay2 4 , 6 , 9 delay3 5 , 3 , 1 我想要一个查询来做到这一点 如果这个答案没问题,请将其标记为“正确答案”并在另一个线程中提出您的第二个问题:) 这样会更容易阅读。 不清楚你真正想要什么。也许您应该编辑您的第一篇文章以阐明您真正想要的结果。

以上是关于SQL 问题:如何将多个结果转换为单行?的主要内容,如果未能解决你的问题,请参考以下文章

如何将SQL查询结果转换为Excel表格推送给企业微信或钉钉的员工账号

如何将单个列转换为单行

将单行转换为多行

Oracle常用函数

ORACLE常用函数汇总

PL SQL如何将任何结果转换为相反的符号