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 问题:如何将多个结果转换为单行?的主要内容,如果未能解决你的问题,请参考以下文章