一个例子 已完成 当需要加强 各位在帮助下
巡检线路表
巡检ID 线路段名称
01 北京至西安
02 北京至郑州 巡检计划时间
ID 起始时间 结束时间 巡检ID
01 2009-8-1 2009-8-3 01
02 2009-8-9 2009-8-11 01
03 2009-8-21 2009-8-23 01
04 2009-8-26 2009-8-28 01
05 2009-8-1 2009-8-2 02
根据以上的两个表得到以下结果,一表关联而二表 ,把二表相关联的时间分别分解的31天的字段中使用1为标识
巡检ID 线路段名称 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
01 北京至西安 1 1 1 1 1 1 1 1 1 1 1 1
02 北京至郑州 1 1 1 csdyyr 台兄 完成的代码 SQL code
DECLARE @TA TABLE([巡检ID] VARCHAR(2), [线路段名称] NVARCHAR(5))
INSERT @TA
SELECT '01', N'北京至西安' UNION ALL
SELECT '02', N'北京至郑州'DECLARE @TB TABLE([ID] VARCHAR(2), [起始时间] DATETIME, [结束时间] DATETIME, [巡检ID] VARCHAR(2))
INSERT @TB
SELECT '01', '2009-8-1', '2009-8-3', '01' UNION ALL
SELECT '02', '2009-8-9', '2009-8-11', '01' UNION ALL
SELECT '03', '2009-8-21', '2009-8-23', '01' UNION ALL
SELECT '04', '2009-8-26', '2009-8-28', '01' UNION ALL
SELECT '05', '2009-8-1', '2009-8-2', '02'
SELECT A.巡检ID,A.线路段名称,
[1]=MAX(CASE WHEN 1 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[2]=MAX(CASE WHEN 2 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[3]=MAX(CASE WHEN 3 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[4]=MAX(CASE WHEN 4 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[5]=MAX(CASE WHEN 5 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[6]=MAX(CASE WHEN 6 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END)
FROM @TA AS A JOIN @TB AS B
ON A.巡检ID=B.巡检ID
GROUP BY A.巡检ID,A.线路段名称
/*
巡检ID 线路段名称 1 2 3 4 5 6
---- ----- ---- ---- ---- ---- ---- ----
01 北京至西安 1 1 1
02 北京至郑州 1 1
*/
csdyyr 台兄 不错 是我要的
不过在提个要求好吗
巡检ID 线路段名称 1 2 3 4 5 6
---- ----- ---- ---- ---- ---- ---- ----
01 北京至西安 1 1 2 2 3 3
02 北京至郑州 1 1
*/ 上面日期的数字能不能返回第几个时间时间段 ,就是第一个时间段为1 第二个为2 第三个为3啊
巡检线路表
巡检ID 线路段名称
01 北京至西安
02 北京至郑州 巡检计划时间
ID 起始时间 结束时间 巡检ID
01 2009-8-1 2009-8-3 01
02 2009-8-9 2009-8-11 01
03 2009-8-21 2009-8-23 01
04 2009-8-26 2009-8-28 01
05 2009-8-1 2009-8-2 02
根据以上的两个表得到以下结果,一表关联而二表 ,把二表相关联的时间分别分解的31天的字段中使用1为标识
巡检ID 线路段名称 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
01 北京至西安 1 1 1 1 1 1 1 1 1 1 1 1
02 北京至郑州 1 1 1 csdyyr 台兄 完成的代码 SQL code
DECLARE @TA TABLE([巡检ID] VARCHAR(2), [线路段名称] NVARCHAR(5))
INSERT @TA
SELECT '01', N'北京至西安' UNION ALL
SELECT '02', N'北京至郑州'DECLARE @TB TABLE([ID] VARCHAR(2), [起始时间] DATETIME, [结束时间] DATETIME, [巡检ID] VARCHAR(2))
INSERT @TB
SELECT '01', '2009-8-1', '2009-8-3', '01' UNION ALL
SELECT '02', '2009-8-9', '2009-8-11', '01' UNION ALL
SELECT '03', '2009-8-21', '2009-8-23', '01' UNION ALL
SELECT '04', '2009-8-26', '2009-8-28', '01' UNION ALL
SELECT '05', '2009-8-1', '2009-8-2', '02'
SELECT A.巡检ID,A.线路段名称,
[1]=MAX(CASE WHEN 1 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[2]=MAX(CASE WHEN 2 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[3]=MAX(CASE WHEN 3 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[4]=MAX(CASE WHEN 4 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[5]=MAX(CASE WHEN 5 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END),
[6]=MAX(CASE WHEN 6 BETWEEN DAY(起始时间) AND DAY(结束时间) THEN '1' ELSE '' END)
FROM @TA AS A JOIN @TB AS B
ON A.巡检ID=B.巡检ID
GROUP BY A.巡检ID,A.线路段名称
/*
巡检ID 线路段名称 1 2 3 4 5 6
---- ----- ---- ---- ---- ---- ---- ----
01 北京至西安 1 1 1
02 北京至郑州 1 1
*/
csdyyr 台兄 不错 是我要的
不过在提个要求好吗
巡检ID 线路段名称 1 2 3 4 5 6
---- ----- ---- ---- ---- ---- ---- ----
01 北京至西安 1 1 2 2 3 3
02 北京至郑州 1 1
*/ 上面日期的数字能不能返回第几个时间时间段 ,就是第一个时间段为1 第二个为2 第三个为3啊
借助系统函数把没有补全的日期补全
然后行转列
可以参考:
http://topic.csdn.net/u/20090906/17/a91cd31e-abf7-4190-8486-c5491aa63c71.html?seed=1380177511&r=59598572#r_59598572
不过在提个要求好吗
巡检ID 线路段名称 1 2 3 4 5 6
---- ----- ---- ---- ---- ---- ---- ----
01 北京至西安 1 1 2 2 3 3
02 北京至郑州 1 1
*/ 上面日期的数字能不能返回第几个时间时间段 ,就是第一个时间段为1 第二个为2 第三个为3啊