乞海
2016-11-14 05:57
采纳率: 0%
浏览 1.4k

请SQL大神帮忙解决车辆排班问题

车辆排班表问题。头都想大了也不知道如何实现。

(1)数据库原始数据
主键:不重复,派团编号:会重复(车是跟团走的),车牌号码:会重复(也可以看做车id值)。时间:在这个日期执行了运输任务。
下面的数据表示是车辆每天的日程安排。例如:
主键为id00 ~ id03的数据表示的意思是:云AL2203在2月11日到7月14日运输了派团编号为 ynkmd 的货物。
主键为id05 ~ id09的数据表示的意思是:云AL2203在2月14日到7月18日运输了派团编号为 MK-3的货物。
图片说明
图一
CREATE TABLE [dbo].行程表L PRIMARY KEY NOT NULL
,[派团编号] NVARCHAR(50) NULL
,[车牌号] NVARCHAR(50) NULL
,[标题] NVARCHAR(50) NULL
,[时间] DATE NULL
)

INSERT INTO [dbo].行程表L
VALUES('ID00','YnkMd','云AL2203','第1天','2016/02/11')
,('ID01','YnkMd','云AL2203','第2天','2016/02/12')
,('ID02','YnkMd','云AL2203','第3天','2016/02/13')
,('ID03','YnkMd','云AL2203','第4天','2016/02/14')
,('ID05','MK-3','云AL2203','第1天','2016/02/14')
,('ID06','MK-3','云AL2203','第2天','2016/02/15')
,('ID07','MK-3','云AL2203','第3天','2016/02/16')
,('ID08','MK-3','云AL2203','第4天','2016/02/17')
,('ID09','MK-3','云AL2203','第5天','2016/02/18')
,('ID10','Y-36','云AL2203','第1天','2016/02/18')
,('ID12','Y-36','云AL2203','第2天','2016/02/19')
,('ID13','Y-36','云AL2203','第3天','2016/02/20')
,('ID20','BJ5','云AL2203','第1天','2016/02/13')
,('ID21','BJ5','云AL2203','第2天','2016/02/14')
,('ID22','BJ5','云AL2203','第3天','2016/02/15')
,('ID23','BJ5','云AL2203','第4天','2016/02/16')
,('ID24','JD-1','云AL2203','第1天','2016/02/16')
,('ID25','JD-1','云AL2203','第2天','2016/02/17')
,('ID26','JD-1','云AL2203','第3天','2016/02/18')
,('ID28','JD-1','云AL2203','第4天','2016/02/19')
,('ID29','M326','贵AL2888','第1天','2016/02/14')
,('ID30','M326','贵AL2888','第2天','2016/02/15')
,('ID31','M326','贵AL2888','第3天','2016/02/16')
,('ID32','M326','贵AL2888','第4天','2016/02/17')
,('ID33','d1','贵AL2888','第1天','2016/02/11')
,('ID34','d1','贵AL2888','第2天','2016/02/12')
,('ID35','d1','贵AL2888','第3天','2016/02/13')
,('ID36','d1','贵AL2888','第4天','2016/02/14')
,('ID37','Y-37','贵AL2888','第1天','2016/02/17')
,('ID38','Y-37','贵AL2888','第2天','2016/02/18')
,('ID39','Y-37','贵AL2888','第3天','2016/02/19')
,('ID40','Y-37','贵AL2888','第4天','2016/02/20')
,('ID41','K324','云AL1314','第1天','2016/02/11')
,('ID42','K324','云AL1314','第2天','2016/02/12')
,('ID43','K324','云AL1314','第3天','2016/02/13')
,('ID44','K324','云AL1314','第4天','2016/02/14')
,('ID45','KMJ02','云AL1314','第1天','2016/02/15')

SELECT [主键],[派团编号],[车牌号],[标题],[时间] FROM [dbo].[行程表L] ORDER BY [车牌号] DESC,[主键] ASC

(2)我想要的结果如下:

注:下面图中的颜色只是为了观看更直观,用数据无关

如果我检索2月11日到2月12日的日程安排的时候,车牌号码为 云AL2203的排班表只会有一条记录,且YnkMd 在第1行。如下
图片说明
图二
如果我检索2月11日到2月13日的日程安排的时候,车牌号码为 云AL2203的排班表会有两条记录。且YnkMd 在第1行,BJ5在第2行。如下
图片说明
图三
如果我检索2月11日到2月15日的日程安排的时候,车牌号码为 云AL2203的排班表会有三条记录。且MK-3在第1行,YnkMd 在第2行,BJ5在第3行,如下
图片说明
图四
检索2月11日到2月19日的日程安排的时候,车牌号码为 云AL2203的排班表会有4条记录。BJ5 在3行,JD-1 在4行,MK-3 在1行,Y-36 在2行,YnkMd 在2行。如图二
图片说明
图五
2月16日云AL2203 同时在3个地方出现(MK-3,BJ5,JD-1)

要求是只能用mysql,不能用游标,查询一个月记录表里面会有上万行记录,游标超级慢。

还想过一个办法如果在插入数据的时候计算这条数据所在行,也不行,因为检测日期段不同排班表所出现的行是不相同的。提前做的计算根本没用。

一直想了好几个月都没有好的办法,各位大神能不能帮忙想想办法。

为盼各位大神帮忙答疑解惑,在下感激不尽!!!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • devmiao 2016-11-14 06:15
    评论
    解决 无用
    打赏 举报
  • Zedee 2016-11-14 06:28

    可否考虑先按日期范围筛出数据存临时表,然后再对临时表用游标处理

    评论
    解决 无用
    打赏 举报
  • Sevan_Li 2016-11-14 15:59

    只能用pivot转换行列了,你的表格也要稍微变化一下

    DECLARE @s NVARCHAR(4000)
    Declare @sql NVARCHAR(4000)  
    select @s=ISNULL(@s+'],[','[')+cast(时间 as nvarchar(10)) from (select distinct 时间 from 行程表 where 时间 between '2016-7-11' and '2016-7-15') as A
    set @s= @s+']'
    SET @sql='select r.* from (select 车牌号,派团编号,时间,主键 from 行程表 where 时间 between ''2016-7-11'' and ''2016-7-15'') as t pivot (count(t.主键) for t.时间 in ('+@s+')) as r'
    print @sql
    EXEC(@sql)
    

    得到的结果是这样的:
    11-15号的:
    图片说明
    11-20号的:
    图片说明

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题