求SQL语句组装编程 各位高手在线等

weixin_42068029 2018-04-25 06:18:15

--创建表与数据的sql语句如下,想得到的结果如下图:

项目 区域 开始日期 结束日期 天数
项目1 市外 2018/1/1 2018/1/9 10
项目1 市外 2018/1/25 2018/1/27 3
项目2 市外 2018/1/14 2018/1/16 3
项目3 市外 2018/1/28 2018/1/31 4

---- 请高手们指点指点。

CREATE TABLE [dbo].[Table_A](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Days] [datetime] NULL,
[XM] [nvarchar](50) NULL,
[QY] [nvarchar](50) NULL
) ON [PRIMARY]

GO


DECLARE @DayTime DATETIME, @DayTime2 datetime

SET @DayTime='2018-01-01'
SET @DayTime2='2018-01-31'
WHILE @DayTime<=@DayTime2
BEGIN
INSERT INTO Table_A([Days],[XM],[QY]) VALUES (@DayTime,'','')
SET @DayTime=DATEADD(DAY,1,@DayTime)
END

UPDATE Table_A SET [XM]='项目1',[QY]='市外' WHERE [Days] BETWEEN '2018-01-01' AND '2018-01-09'

UPDATE Table_A SET [XM]='项目2',[QY]='市内' WHERE [Days] BETWEEN '2018-01-10' AND '2018-01-13'

UPDATE Table_A SET [XM]='项目2',[QY]='市外' WHERE [Days] BETWEEN '2018-01-14' AND '2018-01-16'

UPDATE Table_A SET [XM]='项目3',[QY]='市内' WHERE [Days] BETWEEN '2018-01-17' AND '2018-01-20'

UPDATE Table_A SET [XM]='项目1',[QY]='市内' WHERE [Days] BETWEEN '2018-01-21' AND '2018-01-24'

UPDATE Table_A SET [XM]='项目1',[QY]='市外' WHERE [Days] BETWEEN '2018-01-25' AND '2018-01-27'
UPDATE Table_A SET [XM]='项目3',[QY]='市外' WHERE [Days] BETWEEN '2018-01-28' AND '2018-01-31'

SELECT * FROM Table_A

...全文
956 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_42068029 2018-04-27
  • 打赏
  • 举报
回复
引用 17 楼 YYZhQ 的回复:
我想我可能没能真正理解楼主提出来的问题,为什么我看到这个需求写出来的语句是如此简单呢?不就统计个出差天数吗?怎么用得着这么复杂?如果我理解有误,见谅。
SELECT XM,
       QY,
       MIN(RQ) AS 开始日期,
       MAX(RQ) AS 结束日期,
			 COUNT(RQ)*0.5 as 半天数,
       COUNT(DISTINCT(RQ)) AS 天数
FROM
table_c
WHERE qy='市外'
GROUP BY XM,
       QY
ORDER BY XM;
谢谢您的参与,非常感谢,首先 数据上的日期是没有连贯性的 ,其次一个项目可能分了两个或者三个阶段,比如这个项目1,2号出差了 ,3,4,5号出差的是另一个项目2,7,8号又是项目1出差,按照你的统计 那么项目1出差的开始日期是1号 结束日期则是8号了 实际天数则是4天 但是从开始到结束日期则会给人误以为是9天,就是这样的。还是非常感谢你哈。
weixin_42068029 2018-04-27
  • 打赏
  • 举报
回复
引用 16 楼 RINK_1 的回复:
你源表的数据本身就有些不规范,就拿'项目1','市外','2018-03-10 00:00:00.000'这个为例,3月10日是周六,这天是记录在表中的,而3月11日是周日,没有记录在表中,但是最后的结果却需要和3月10这天一起作为连续的工时一起计算在内的。类似的,3月4日这天就完全没有纳入统计。如果市内的双休日不纳入统计,那除此以外的双休日就应该有对应的数据记录存在表中。

with cte_1
as
(select XM,QY,CONVERT(DATE,RQ) AS rq_new from Table_C
 group by XM,QY,CONVERT(DATE,RQ))
 

select XM,QY,MIN(rq_new) as start_date,MAX(rq_new) as end_date,count(1) as amount
from
(select *,
ROW_NUMBER() over (partition by XM,QY order by rq_new) as rn_1,
DATEDIFF(DAY,'1900-01-01',rq_new) as rn_2
from cte_1) as A
group by XM,QY,rn_2-rn_1
order by xm,start_date
引用 16 楼 RINK_1 的回复:
你源表的数据本身就有些不规范,就拿'项目1','市外','2018-03-10 00:00:00.000'这个为例,3月10日是周六,这天是记录在表中的,而3月11日是周日,没有记录在表中,但是最后的结果却需要和3月10这天一起作为连续的工时一起计算在内的。类似的,3月4日这天就完全没有纳入统计。如果市内的双休日不纳入统计,那除此以外的双休日就应该有对应的数据记录存在表中。

with cte_1
as
(select XM,QY,CONVERT(DATE,RQ) AS rq_new from Table_C
 group by XM,QY,CONVERT(DATE,RQ))
 

select XM,QY,MIN(rq_new) as start_date,MAX(rq_new) as end_date,count(1) as amount
from
(select *,
ROW_NUMBER() over (partition by XM,QY order by rq_new) as rn_1,
DATEDIFF(DAY,'1900-01-01',rq_new) as rn_2
from cte_1) as A
group by XM,QY,rn_2-rn_1
order by xm,start_date
引用 16 楼 RINK_1 的回复:
你源表的数据本身就有些不规范,就拿'项目1','市外','2018-03-10 00:00:00.000'这个为例,3月10日是周六,这天是记录在表中的,而3月11日是周日,没有记录在表中,但是最后的结果却需要和3月10这天一起作为连续的工时一起计算在内的。类似的,3月4日这天就完全没有纳入统计。如果市内的双休日不纳入统计,那除此以外的双休日就应该有对应的数据记录存在表中。

with cte_1
as
(select XM,QY,CONVERT(DATE,RQ) AS rq_new from Table_C
 group by XM,QY,CONVERT(DATE,RQ))
 

select XM,QY,MIN(rq_new) as start_date,MAX(rq_new) as end_date,count(1) as amount
from
(select *,
ROW_NUMBER() over (partition by XM,QY order by rq_new) as rn_1,
DATEDIFF(DAY,'1900-01-01',rq_new) as rn_2
from cte_1) as A
group by XM,QY,rn_2-rn_1
order by xm,start_date
您好 是这样的 工时呢默认时间是正常上班情况下的数据 比如 周一到周五是有数据默认存在的,周六周日呢 在页面是不显示的 但是 那天如果加班了的话 可以通过下拉菜单表将周末的数据加载上去,如果不手动增加数据的话 点击保存的时候就会默认那天没上班 工时表中就不会体现出那天的数据,如果那天没有数据 3月10号工作了 11 默认他休息了 就不参与计算了。
RINK_1 2018-04-27
  • 打赏
  • 举报
回复
引用 18 楼 weixin_42068029 的回复:
[quote=引用 16 楼 RINK_1 的回复:] 你源表的数据本身就有些不规范,就拿'项目1','市外','2018-03-10 00:00:00.000'这个为例,3月10日是周六,这天是记录在表中的,而3月11日是周日,没有记录在表中,但是最后的结果却需要和3月10这天一起作为连续的工时一起计算在内的。类似的,3月4日这天就完全没有纳入统计。如果市内的双休日不纳入统计,那除此以外的双休日就应该有对应的数据记录存在表中。

with cte_1
as
(select XM,QY,CONVERT(DATE,RQ) AS rq_new from Table_C
 group by XM,QY,CONVERT(DATE,RQ))
 

select XM,QY,MIN(rq_new) as start_date,MAX(rq_new) as end_date,count(1) as amount
from
(select *,
ROW_NUMBER() over (partition by XM,QY order by rq_new) as rn_1,
DATEDIFF(DAY,'1900-01-01',rq_new) as rn_2
from cte_1) as A
group by XM,QY,rn_2-rn_1
order by xm,start_date
引用 16 楼 RINK_1 的回复:
你源表的数据本身就有些不规范,就拿'项目1','市外','2018-03-10 00:00:00.000'这个为例,3月10日是周六,这天是记录在表中的,而3月11日是周日,没有记录在表中,但是最后的结果却需要和3月10这天一起作为连续的工时一起计算在内的。类似的,3月4日这天就完全没有纳入统计。如果市内的双休日不纳入统计,那除此以外的双休日就应该有对应的数据记录存在表中。

with cte_1
as
(select XM,QY,CONVERT(DATE,RQ) AS rq_new from Table_C
 group by XM,QY,CONVERT(DATE,RQ))
 

select XM,QY,MIN(rq_new) as start_date,MAX(rq_new) as end_date,count(1) as amount
from
(select *,
ROW_NUMBER() over (partition by XM,QY order by rq_new) as rn_1,
DATEDIFF(DAY,'1900-01-01',rq_new) as rn_2
from cte_1) as A
group by XM,QY,rn_2-rn_1
order by xm,start_date
引用 16 楼 RINK_1 的回复:
你源表的数据本身就有些不规范,就拿'项目1','市外','2018-03-10 00:00:00.000'这个为例,3月10日是周六,这天是记录在表中的,而3月11日是周日,没有记录在表中,但是最后的结果却需要和3月10这天一起作为连续的工时一起计算在内的。类似的,3月4日这天就完全没有纳入统计。如果市内的双休日不纳入统计,那除此以外的双休日就应该有对应的数据记录存在表中。

with cte_1
as
(select XM,QY,CONVERT(DATE,RQ) AS rq_new from Table_C
 group by XM,QY,CONVERT(DATE,RQ))
 

select XM,QY,MIN(rq_new) as start_date,MAX(rq_new) as end_date,count(1) as amount
from
(select *,
ROW_NUMBER() over (partition by XM,QY order by rq_new) as rn_1,
DATEDIFF(DAY,'1900-01-01',rq_new) as rn_2
from cte_1) as A
group by XM,QY,rn_2-rn_1
order by xm,start_date
您好 是这样的 工时呢默认时间是正常上班情况下的数据 比如 周一到周五是有数据默认存在的,周六周日呢 在页面是不显示的 但是 那天如果加班了的话 可以通过下拉菜单表将周末的数据加载上去,如果不手动增加数据的话 点击保存的时候就会默认那天没上班 工时表中就不会体现出那天的数据,如果那天没有数据 3月10号工作了 11 默认他休息了 就不参与计算了。[/quote] 如果3月11日没有记录在工时表中而默认为休息的,那你给出的期望结果就有误,项目1 市外 2018-03-10 2018-03-13 4,你这个期望结果就是把3月11号也作为工时统计进去了。 如果完全是以工时表中记录的数据为准来统计的,没有记录就算休息,那你试试我上面的写法。
weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
[quote=引用 5 楼 weixin_42068029 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:]
SELECT XM,
       QY,
       rn,
       MIN(Days) AS 开始日期,
       MAX(Days) AS 结束日期,
	   DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
    SELECT *,
           ID - ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
    FROM Table_A
    WHERE QY = '市外'
) t
GROUP BY XM,
         QY,
         rn
ORDER BY t.XM;
一个问题 ID 必须是顺序的 如果ID的顺序不是有规律的 这个语句貌似就不行了 比如我中间id隔了几个数据 就不行了 研究研究。[/quote] 如果ID不是连续的可以用rownumber代替,生成一列连续的自增值[/quote] 同一个项目中像这样的日期:2018-03-29 00:00:00.000 2018-03-29 00:00:00.000 2018-03-31 00:00:00.000 2018-03-31 00:00:00.000 2018-04-01 00:00:00.000 2018-04-01 00:00:00.000 统计出来是29号到4月1号 天数也不对的 其实30号是没有数据的。
weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
[quote=引用 5 楼 weixin_42068029 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:]
SELECT XM,
       QY,
       rn,
       MIN(Days) AS 开始日期,
       MAX(Days) AS 结束日期,
	   DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
    SELECT *,
           ID - ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
    FROM Table_A
    WHERE QY = '市外'
) t
GROUP BY XM,
         QY,
         rn
ORDER BY t.XM;
一个问题 ID 必须是顺序的 如果ID的顺序不是有规律的 这个语句貌似就不行了 比如我中间id隔了几个数据 就不行了 研究研究。[/quote] 如果ID不是连续的可以用rownumber代替,生成一列连续的自增值[/quote] 如果中间日期也有不连续性的 日期也有缺少的 日期也并非连续着的 也是不行的 还请高手指点 在线等。
二月十六 版主 2018-04-26
  • 打赏
  • 举报
回复
引用 5 楼 weixin_42068029 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:]
SELECT XM,
       QY,
       rn,
       MIN(Days) AS 开始日期,
       MAX(Days) AS 结束日期,
	   DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
    SELECT *,
           ID - ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
    FROM Table_A
    WHERE QY = '市外'
) t
GROUP BY XM,
         QY,
         rn
ORDER BY t.XM;
一个问题 ID 必须是顺序的 如果ID的顺序不是有规律的 这个语句貌似就不行了 比如我中间id隔了几个数据 就不行了 研究研究。[/quote] 如果ID不是连续的可以用rownumber代替,生成一列连续的自增值
weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
SELECT XM,
       QY,
       rn,
       MIN(Days) AS 开始日期,
       MAX(Days) AS 结束日期,
	   DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
    SELECT *,
           ID - ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
    FROM Table_A
    WHERE QY = '市外'
) t
GROUP BY XM,
         QY,
         rn
ORDER BY t.XM;
一个问题 ID 必须是顺序的 如果ID的顺序不是有规律的 这个语句貌似就不行了 比如我中间id隔了几个数据 就不行了 研究研究。
weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
SELECT XM,
       QY,
       rn,
       MIN(Days) AS 开始日期,
       MAX(Days) AS 结束日期,
	   DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
    SELECT *,
           ID - ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
    FROM Table_A
    WHERE QY = '市外'
) t
GROUP BY XM,
         QY,
         rn
ORDER BY t.XM;
版主威武,在仔细领悟版主的sql语句的思路。牛人
二月十六 版主 2018-04-26
  • 打赏
  • 举报
回复
SELECT XM,
QY,
rn,
MIN(Days) AS 开始日期,
MAX(Days) AS 结束日期,
DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
SELECT *,
ID - ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
FROM Table_A
WHERE QY = '市外'
) t
GROUP BY XM,
QY,
rn
ORDER BY t.XM;


weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
没有高手能指点这个问题吗?SQL高手们。
YYZhQ 2018-04-26
  • 打赏
  • 举报
回复
我想我可能没能真正理解楼主提出来的问题,为什么我看到这个需求写出来的语句是如此简单呢?不就统计个出差天数吗?怎么用得着这么复杂?如果我理解有误,见谅。
SELECT XM,
QY,
MIN(RQ) AS 开始日期,
MAX(RQ) AS 结束日期,
COUNT(RQ)*0.5 as 半天数,
COUNT(DISTINCT(RQ)) AS 天数
FROM
table_c
WHERE qy='市外'
GROUP BY XM,
QY
ORDER BY XM;

RINK_1 2018-04-26
  • 打赏
  • 举报
回复
你源表的数据本身就有些不规范,就拿'项目1','市外','2018-03-10 00:00:00.000'这个为例,3月10日是周六,这天是记录在表中的,而3月11日是周日,没有记录在表中,但是最后的结果却需要和3月10这天一起作为连续的工时一起计算在内的。类似的,3月4日这天就完全没有纳入统计。如果市内的双休日不纳入统计,那除此以外的双休日就应该有对应的数据记录存在表中。

with cte_1
as
(select XM,QY,CONVERT(DATE,RQ) AS rq_new from Table_C
 group by XM,QY,CONVERT(DATE,RQ))
 

select XM,QY,MIN(rq_new) as start_date,MAX(rq_new) as end_date,count(1) as amount
from
(select *,
ROW_NUMBER() over (partition by XM,QY order by rq_new) as rn_1,
DATEDIFF(DAY,'1900-01-01',rq_new) as rn_2
from cte_1) as A
group by XM,QY,rn_2-rn_1
order by xm,start_date
weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复

CREATE TABLE [dbo].[Table_C](
	[XM] [nvarchar](50) NULL,
	[QY] [nvarchar](50) NOT NULL,
	[RQ] [datetime] NOT NULL,
	[QJ] [varchar](4) NOT NULL
) ON [PRIMARY]

insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','公司','2018-03-02 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','公司','2018-03-02 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','公司','2018-03-03 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市内','2018-03-03 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市内','2018-03-05 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市内','2018-03-05 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','公司','2018-03-06 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','公司','2018-03-06 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目3','公司','2018-03-07 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目3','公司','2018-03-07 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目3','市内','2018-03-08 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目3','市内','2018-03-08 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目3','市外','2018-03-09 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目3','市外','2018-03-09 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','市外','2018-03-10 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','市外','2018-03-10 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','市外','2018-03-12 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','市外','2018-03-12 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','市外','2018-03-13 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','市外','2018-03-13 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','省外','2018-03-14 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目1','省外','2018-03-14 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','省外','2018-03-15 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','省外','2018-03-15 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','省外','2018-03-16 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','省外','2018-03-16 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市外','2018-03-17 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市外','2018-03-17 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-03-19 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-03-19 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-03-20 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-03-20 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','省外','2018-03-21 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','省外','2018-03-21 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','省外','2018-03-22 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','省外','2018-03-22 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','省外','2018-03-23 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市外','2018-03-23 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市外','2018-03-24 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','公司','2018-03-24 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','公司','2018-03-26 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市外','2018-03-26 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市外','2018-03-27 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目2','市内','2018-03-27 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市内','2018-03-28 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市内','2018-03-28 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市内','2018-03-29 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市内','2018-03-29 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-03-31 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-03-31 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-04-01 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-04-01 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市外','2018-04-02 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市内','2018-04-02 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市内','2018-04-03 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目4','市内','2018-04-03 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目5','市内','2018-04-04 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目5','市内','2018-04-04 00:00:00.000','下午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目5','市内','2018-04-05 00:00:00.000','上午')
insert into Table_C (XM,QY,RQ,QJ) Values ('项目5','市内','2018-04-05 00:00:00.000','下午')

-- 查询后结果如下:
项目	区域	开始日期	结束日期	天数
项目1	公司内部	2018-03-02	2018-03-02	1
项目1	市外	2018-03-10	2018-03-13	4
项目1	省外	2018-03-14	2018-03-14	1
项目2	市内	2018-03-03	2018-03-03	1
项目2	市内	2018-03-05	2018-03-05	1
项目2	公司内部	2018-03-06	2018-03-07	2
项目2	省外	2018-03-15	2018-03-16	2
项目2	市外	2018-03-17	2018-03-17	1
项目2	市外	2018-03-23	2018-03-24	2
项目2	公司内部	2018-03-24	2018-03-26	3
项目2	市外	2018-03-26	2018-03-27	2
项目2	市内	2018-03-27	2018-03-27	1
项目3	公司内部	2018-03-07	2018-03-07	1
项目3	市内	2018-03-08	2018-03-08	1
项目3	市外	2018-03-09	2018-03-09	1
项目4	市外	2018-03-19	2018-03-20	2
项目4	省外	2018-03-21	2018-03-23	3
项目4	市内	2018-03-28	2018-03-29	2
项目4	市外	2018-03-31	2018-04-02	3
项目4	市内	2018-04-02	2018-04-03	2


--- 解释一下原始数据表结构哈:
  这是一张工时表 每天的工时分为上午和下午两类,公司内部 表示是在公司工作,不算出差,市内 表示是在市内出差 市内出差呢   市外 表示市外出差,
省外则表示在省外出差,因为出差标准不一样 所以要分开计算;

有可能一天之内 上午在公司工作  下午出差了 则要体现出这一天的两条记录 则 这一天 既有市内也有在公司工作的数据。
请高手指点。。。。
weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
引用 13 楼 sinat_28984567 的回复:
SELECT XM,
       QY,
       rn,
       MIN(Days) AS 开始日期,
       MAX(Days) AS 结束日期,
       DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
    SELECT *,
          DATEDIFF(DAY,'2018-01-01',days)-ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
    FROM Table_A
    WHERE QY = '市外'
) t
GROUP BY XM,
         QY,
         rn
ORDER BY t.XM;
非常感谢版主的帮助 真的是非常感谢,不知道为什么 ,套在我的数据上出现的结果就不一样了 现在我将我正式库的真实的数据贴一下 请您指正一下 楼下是脚本语句 请稍候。。。
二月十六 版主 2018-04-26
  • 打赏
  • 举报
回复
SELECT XM,
QY,
rn,
MIN(Days) AS 开始日期,
MAX(Days) AS 结束日期,
DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
SELECT *,
DATEDIFF(DAY,'2018-01-01',days)-ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
FROM Table_A
WHERE QY = '市外'
) t
GROUP BY XM,
QY,
rn
ORDER BY t.XM;


weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
大神 贴出来了。请指教。

--创建表与数据的sql语句如下,想得到的结果如下图:
 
项目    区域    开始日期    结束日期    天数
项目1    市外    2018/1/1    2018/1/9    10
项目1    市外    2018/1/24    2018/1/26    3
项目2    市外    2018/1/14    2018/1/16    3
项目3    市外    2018/1/27    2018/1/27    1
项目3    市外    2018/1/29    2018/1/31    3
 
---- 请高手们指点指点。
 
 DROP TABLE [Table_A];
 
CREATE TABLE [dbo].[Table_A](
    [Days] [datetime] NULL,
    [XM] [nvarchar](50) NULL,
    [QY] [nvarchar](50) NULL
) ON [PRIMARY]
 
GO
 
 
DECLARE @DayTime DATETIME, @DayTime2 datetime
 
SET @DayTime='2018-01-01'
SET @DayTime2='2018-01-31'
 WHILE @DayTime<=@DayTime2
 BEGIN
  INSERT INTO Table_A([Days],[XM],[QY]) VALUES (@DayTime,'','')
  SET @DayTime=DATEADD(DAY,1,@DayTime)
 END
  
 UPDATE Table_A SET [XM]='项目1',[QY]='市外' WHERE [Days] BETWEEN '2018-01-01' AND '2018-01-09'
  
 UPDATE Table_A SET [XM]='项目2',[QY]='市内' WHERE [Days] BETWEEN '2018-01-10' AND '2018-01-13'
  
 UPDATE Table_A SET [XM]='项目2',[QY]='市外' WHERE [Days] BETWEEN '2018-01-14' AND '2018-01-16'
  
 UPDATE Table_A SET [XM]='项目3',[QY]='市内' WHERE [Days] BETWEEN '2018-01-17' AND '2018-01-20'
  
 UPDATE Table_A SET [XM]='项目1',[QY]='市内' WHERE [Days] BETWEEN '2018-01-21' AND '2018-01-23'
  
  UPDATE Table_A SET [XM]='项目1',[QY]='市外' WHERE [Days] BETWEEN '2018-01-24' AND '2018-01-26'
  
  UPDATE Table_A SET [XM]='项目3',[QY]='市外' WHERE [Days] BETWEEN '2018-01-27' AND '2018-01-27'
    
  UPDATE Table_A SET [XM]='项目3',[QY]='市外' WHERE [Days] BETWEEN '2018-01-29' AND '2018-01-31'
  
  DELETE FROM Table_A WHERE [Days] = '2018-01-28'
  
 SELECT * FROM Table_A
weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 8 楼 weixin_42068029 的回复:] [quote=引用 6 楼 sinat_28984567 的回复:] [quote=引用 5 楼 weixin_42068029 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:]
SELECT XM,
       QY,
       rn,
       MIN(Days) AS 开始日期,
       MAX(Days) AS 结束日期,
	   DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
    SELECT *,
           ID - ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
    FROM Table_A
    WHERE QY = '市外'
) t
GROUP BY XM,
         QY,
         rn
ORDER BY t.XM;
一个问题 ID 必须是顺序的 如果ID的顺序不是有规律的 这个语句貌似就不行了 比如我中间id隔了几个数据 就不行了 研究研究。[/quote] 如果ID不是连续的可以用rownumber代替,生成一列连续的自增值[/quote] 同一个项目中像这样的日期:2018-03-29 00:00:00.000 2018-03-29 00:00:00.000 2018-03-31 00:00:00.000 2018-03-31 00:00:00.000 2018-04-01 00:00:00.000 2018-04-01 00:00:00.000 统计出来是29号到4月1号 天数也不对的 其实30号是没有数据的。 [/quote] 测试数据能给下吗,没太理解这个意思。 给出测试数据和数据对应的查询结果[/quote] 好的大神 马上 贴上来。
二月十六 版主 2018-04-26
  • 打赏
  • 举报
回复
引用 8 楼 weixin_42068029 的回复:
[quote=引用 6 楼 sinat_28984567 的回复:] [quote=引用 5 楼 weixin_42068029 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:]
SELECT XM,
       QY,
       rn,
       MIN(Days) AS 开始日期,
       MAX(Days) AS 结束日期,
	   DATEDIFF(DAY,MIN(Days),MAX(Days))+1 AS 天数
FROM
(
    SELECT *,
           ID - ROW_NUMBER() OVER (PARTITION BY XM ORDER BY Days) AS rn
    FROM Table_A
    WHERE QY = '市外'
) t
GROUP BY XM,
         QY,
         rn
ORDER BY t.XM;
一个问题 ID 必须是顺序的 如果ID的顺序不是有规律的 这个语句貌似就不行了 比如我中间id隔了几个数据 就不行了 研究研究。[/quote] 如果ID不是连续的可以用rownumber代替,生成一列连续的自增值[/quote] 同一个项目中像这样的日期:2018-03-29 00:00:00.000 2018-03-29 00:00:00.000 2018-03-31 00:00:00.000 2018-03-31 00:00:00.000 2018-04-01 00:00:00.000 2018-04-01 00:00:00.000 统计出来是29号到4月1号 天数也不对的 其实30号是没有数据的。 [/quote] 测试数据能给下吗,没太理解这个意思。 给出测试数据和数据对应的查询结果
weixin_42068029 2018-04-26
  • 打赏
  • 举报
回复
还有高手指点一下吗?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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