去重复问题

jsoner 2010-09-10 09:29:48
现在做一个车辆调度系统,需要求得车辆调度出车的天数
如:A车出车日期为:
(1) 2010-08-13到2010-08-23
(2) 2010-08-23到2010-08-23(相当于回来后又跑了次短途)
(3) 2010-08-23到2010-08-25
(4) 2010-08-26到2010-08-28
(5) 2010-08-28到2010-09-01
求该车的总出车天数.
如(1)得到的是11天
(2)得到1天
(3)得到3天
不能直接累加,因为23号有重复计算
...全文
183 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsoner 2010-09-10
  • 打赏
  • 举报
回复
回14楼,说不通呃...
因为是很多司机,很多日期段
SUM出来=0的数据会很多,明明没出过车的司机,也算出车一天.呃...


上午搞不定,就按我自己的方法写了,整个全年临时表了,像做日程安排那样,0,1来标识,笛卡尔积后,条件过滤后再COUNT,哈.
飘零一叶 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jsoner 的回复:]
三条记录,注意一下,2010-08-23,在三条记录里都有,需要的是统计的是出车天数,而不是出车次数.
这样,2010-08-23在计算时,会重复计算
极端点算.三个短途,在一天内完成
(1)开始2010-08-23结束还是2010-08-23
(2)开始2010-08-23结束还是2010-08-23
(3)开始2010-08-23结束还是2010-08-23
这样,总不能给司机算出车三天吧[/Quote]
用DATEDIFF算出来的时候是0天,你只需在sum前面加个case when sum=0 then sum+1 else sum end
jsoner 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dlut_liuq 的回复:]

SQL code
IF OBJECT_ID('CAR') IS NOT NULL
DROP TABLE CAR
GO
CREATE TABLE CAR
(
CID NVARCHAR(10),
S_DATE SMALLDATETIME,
D_DATE SMALLDATETIME
)
INSERT INTO CAR
SELECT 'GB001','2010-01-03','20……
[/Quote]

三条记录,注意一下,2010-08-23,在三条记录里都有,需要的是统计的是出车天数,而不是出车次数.
这样,2010-08-23在计算时,会重复计算
极端点算.三个短途,在一天内完成
(1)开始2010-08-23结束还是2010-08-23
(2)开始2010-08-23结束还是2010-08-23
(3)开始2010-08-23结束还是2010-08-23
这样,总不能给司机算出车三天吧
jsoner 2010-09-10
  • 打赏
  • 举报
回复
跨月分不怕.我已经有写了.
问题就是会重复统计一些日期的数据.
王向飞 2010-09-10
  • 打赏
  • 举报
回复
有三条不就是当天有三次短途记录吗?
如果不是,那为什么要记录到数据库?
[Quote=引用 8 楼 jsoner 的回复:]
引用 5 楼 wxf163 的回复:

去什么重复?(1) 2010-08-13到2010-08-23
(2) 2010-08-23到2010-08-23(相当于回来后又跑了次短途)
(3) 2010-08-23到2010-08-25
(4) 2010-08-26到2010-08-28
(5) 2010-08-28到2010-09-01
哪有重复的?


如果没有(1)(3),……
[/Quote]
飘零一叶 2010-09-10
  • 打赏
  • 举报
回复
IF OBJECT_ID('CAR') IS NOT NULL
DROP TABLE CAR
GO
CREATE TABLE CAR
(
CID NVARCHAR(10),
S_DATE SMALLDATETIME,
D_DATE SMALLDATETIME
)
INSERT INTO CAR
SELECT 'GB001','2010-01-03','2010-01-23' UNION ALL
SELECT 'GB001','2010-01-23','2010-01-23' UNION ALL
SELECT 'GB001','2010-02-01','2010-02-23' UNION ALL
SELECT 'GB001','2010-03-02','2010-03-22' UNION ALL
SELECT 'GB001','2010-03-22','2010-03-23' UNION ALL
SELECT 'GB001','2010-03-27','2010-04-10' UNION ALL
SELECT 'GB003','2010-04-03','2010-04-12' UNION ALL
SELECT 'GB003','2010-05-06','2010-05-17' UNION ALL
SELECT 'GB003','2010-07-01','2010-07-10'

SELECT CASE WHEN GROUPING(CID)=0 THEN CID ELSE 'ALL' END
,SUM(DATEDIFF(DD,CASE WHEN S_DATE> DATEADD(MONTH,DATEDIFF(MONTH,0,D_DATE),0) THEN S_DATE ELSE DATEADD(MONTH,DATEDIFF(MONTH,0,D_DATE),0) END, D_DATE ))
,CASE WHEN GROUPING(LEFT(CONVERT(NVARCHAR(10),D_DATE,112),6))=0 THEN LEFT(CONVERT(NVARCHAR(10),D_DATE,112),6) ELSE 'ALL' END
FROM CAR GROUP BY CID,LEFT(CONVERT(NVARCHAR(10),D_DATE,112),6) WITH ROLLUP

还有点小问题 你参考下
飘零一叶 2010-09-10
  • 打赏
  • 举报
回复
其实问题主要是在
当开始日期和结束日期 跨越月份的时候 group BY完了的数据会不准确
jsoner 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wxf163 的回复:]

去什么重复?(1) 2010-08-13到2010-08-23
(2) 2010-08-23到2010-08-23(相当于回来后又跑了次短途)
(3) 2010-08-23到2010-08-25
(4) 2010-08-26到2010-08-28
(5) 2010-08-28到2010-09-01
哪有重复的?
[/Quote]

如果没有(1)(3),驾驶员23号出车,datediff出来为0,也就把人家一天的工作给抹杀了...

(1) 2010-08-13到2010-08-23
(2) 2010-08-23到2010-08-23(相当于回来后又跑了次短途)
(3) 2010-08-23到2010-08-25

(4) 2010-08-28到2010-08-30
(5) 2010-09-04到2010-09-07

这样看.
统计天数,结束日期-起始日期+1,都知道的.
问题如前三条数据一样,23号会计算3次.
hao1hao2hao3 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jsoner 的回复:]
引用 1 楼 jsoner 的回复:

因为要按月来GROUP BY ,统计一年的.
不想建个全年的临时表...
所以,向大家咨询看有没有更好的方法


等了好久了,终于有个回复的了.
谢谢.
请看一下标题和需求
问题是怎么去重复.唉...
[/Quote]

哪是去重复啊!是要看日期是否连续!

1和2一起算,得到了11天
cjzm83 2010-09-10
  • 打赏
  • 举报
回复
datediff(d,'2010-08-23','2010-08-23') = 0 这个不能去重复?
王向飞 2010-09-10
  • 打赏
  • 举报
回复
去什么重复?(1) 2010-08-13到2010-08-23
(2) 2010-08-23到2010-08-23(相当于回来后又跑了次短途)
(3) 2010-08-23到2010-08-25
(4) 2010-08-26到2010-08-28
(5) 2010-08-28到2010-09-01
哪有重复的?
ws_hgo 2010-09-10
  • 打赏
  • 举报
回复
怎么算出来的啊
jsoner 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jsoner 的回复:]

因为要按月来GROUP BY ,统计一年的.
不想建个全年的临时表...
所以,向大家咨询看有没有更好的方法
[/Quote]

等了好久了,终于有个回复的了.
谢谢.
请看一下标题和需求
问题是怎么去重复.唉...
cjzm83 2010-09-10
  • 打赏
  • 举报
回复

select 车牌号,sum(datediff(d,出车日期,归来日期)) + 1 from tb group by 车牌号
jsoner 2010-09-10
  • 打赏
  • 举报
回复
因为要按月来GROUP BY ,统计一年的.
不想建个全年的临时表...
所以,向大家咨询看有没有更好的方法

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧