关于数据统计,显示

wrost 2012-02-26 12:48:19
有一个表:
日期-----小时-----生产线-----产品数量
(同一日期,可能有很多个时间段的数据;也可能在某个日期没有数据)



我想提供2个日期节点,查询这2个时间节点的统计数据,比如2012.2.20---2012.2.26:

日期------------------------生产线-----数量总计
2012.2.20 生产线A 0 (某个日期没有记录的显示情况)

2012.2.21 生产线A 80(有数据的情况:这个数字,是该日期内,所有小时数据的统计)
2012.2.22
2012.2.23
2012.2.24
2012.2.25
2012.2.26


数据统计我会,但是如果该天没有记录,怎么显示出来,不知道怎么写? 请大家帮助下





...全文
174 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfkmu 2012-02-28
  • 打赏
  • 举报
回复
不错不错
wrost 2012-02-26
  • 打赏
  • 举报
回复
自己先顶一下!
wrost 2012-02-26
  • 打赏
  • 举报
回复
看几个小时终于看懂了

不过加不加isnull,结果好像都是一样。
wrost 2012-02-26
  • 打赏
  • 举报
回复
select isnull((select count(1) from sysobjects where id<t.id),0) as num from sysobjects t


这段代码还是没看懂,为什么把sysobjects 这个表弄进来?

请大师再解答下
wrost 2012-02-26
  • 打赏
  • 举报
回复
不好意思,没注意 NUM 是在下边定义的
wrost 2012-02-26
  • 打赏
  • 举报
回复
select 
dateadd(dd,num,@sdate) dt


num 我在SQL 2000 联机帮助里边没有查到,是系统内的常量吗?

帮助文件:
语法
DATEADD ( datepart , number, date )
number
是用来增加 datepart 的值。如果指定一个不是整数的值,则将废弃此值的小数部分。例如,如果为 datepart 指定 day,为 number 指定 1.75,则 date 将增加 1。

听不太明白什么意思?

请指教下

wrost 2012-02-26
  • 打赏
  • 举报
回复
先感谢(爱新觉罗.毓华)

先消化下

百年树人 2012-02-26
  • 打赏
  • 举报
回复
declare @sdt datetime,@edt datetime
select @sdt='2012-2-20',@edt='2012-2-26'

select a.*,isnull(b.数量,0) as 数量总计
from
(
select convert(varchar(10),dateadd(dd,number,@sdt),120) as 日期,a.生产线
from (select distinct 生产线 from tb) a,master..spt_values b
where type='P'
and dateadd(dd,number,@sdt)<=@edt
) a
left join
(
select convert(varchar(10),日期,120) as 日期,生产线,sum(产品数量) as 数量
from tb
group by convert(varchar(10),日期,120),生产线
) b
on a.日期=b.日期 and a.生产线=b.生产线
dawugui 2012-02-26
  • 打赏
  • 举报
回复
其实就是先获取一个时间段,然后使用左连接,相关内容见下:
获取两个时间之内的所有日期

--sql 2000
declare @sdate datetime
declare @edate datetime
set @sdate = '2008-10-15 00:00:000'
set @edate = '2009-02-10 00:00:000'


select
dateadd(dd,num,@sdate) dt
from
(select isnull((select count(1) from sysobjects where id<t.id),0) as num from sysobjects t) a
where
dateadd(dd,num,@sdate)<=@edate


--sql 2005
declare @startDate datetime
declare @endDate datetime

SELECT @startDate = '2008-10-15' ,@endDate = '2009-01-23'
;WITH tb AS (
SELECT @startDate AS 'date'
UNION ALL
SELECT DATEADD(DAY,1,date) FROM tb WHERE DATE<@endDate
)
SELECT tb.date from tb


生成日期的方法

方法一、

declare @t table(s datetime)
declare @s datetime,@s1 datetime
set @s = '2010-09-15'
set @s1 = '2010-10-15'
while @s <= @s1
begin
insert into @t select @s
set @s = dateadd(dd,1,@s)
end
select * from @t


方法二、
select
dateadd(dd,number,'2010-09-15') as s
from
master..spt_values
where
type='p'
and
dateadd(dd,number,'2010-09-15')<='2010-10-15'
dawugui 2012-02-26
  • 打赏
  • 举报
回复
--sql 2000
declare @sdate datetime
declare @edate datetime
set @sdate = '2012-02-20 00:00:000'
set @edate = '2012-02-26 00:00:000'

select t1.*, 数量总计 = (select sum(产品数量) from 你的表 t2 where t2.生产线 = t1.生产线 and datediff(dd,t2.日期,t1.dt) = 0) from
(
select m.dt , n.生产线 from
(
select
dateadd(dd,num,@sdate) dt
from
(select isnull((select count(1) from sysobjects where id<t.id),0) as num from sysobjects t) a
where
dateadd(dd,num,@sdate)<=@edate
) m , 你的表 n
) t1
order by t1.dt 日期 , t1.生产线

27,580

社区成员

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

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