sql时段累计之和问题

net_xiaojian 2010-08-01 07:50:19

create table tb1(id int ,TM datetime,
p8 int,
p9 int,
p10 int,
p11 int,
p12 int,
p13 int,
p14 int,
p15 int,
p16 int,
p17 int,
p18 int,
p19 int,
p20 int,
p21 int,
p22 int,
p23 int,
p0 int,
p1 int,
p2 int,
p3 int,
p4 int,
p5 int,
p6 int,
p7 int
)

p类似的字段代表小时。

insert into @table
select 118,'2010-07-14 01:00:00',1001,2002,3003,4004,5005,6006,7007,8008,9009,100010,110011,120012,130013,140014,150015,160016,170017,180018,190019,200020,210021,220022,230023,240024
union all
select 119,'2010-07-10 、10:00:00',1001,2002,3003,4004,5005,6006,7007,8008,9009,100010,110011,120012,130013,140014,150015,160016,170017,180018,190019,200020,210021,220022,230023,240024

界面上时间选择:
1、2010-07-01 19 --- 2010-07-15 01,p19+p20+...+p0+p1(时间段 TM between '2010-07-01' and '2010-07-15' 时间段不用管,主要是时段相加不懂)
2、2010-07-01 01 --- 2010-07-15 07,p1+...+p7 这种好做点。

--数据显示
id, 累计之和






http://topic.csdn.net/u/20100714/12/daac12b8-035f-4938-a891-110b7c6868e2.html
...全文
219 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hokor 2010-08-01
  • 打赏
  • 举报
回复
终于理解了,开始完全怪沟里去了。。
declare @begin datetime    --开始时间
declare @end datetime --结束时间
set @begin='2010-7-13 21:18:39' set @end='2010-7-14 11:18:59'

SELECT ID,SUM(P)[累计之和] FROM (
SELECT id,TM,p8 P FROM TB
UNION ALL SELECT id,TM,p9 FROM TB
UNION ALL SELECT id,TM,p10 FROM TB
UNION ALL SELECT id,TM,p11 FROM TB
UNION ALL SELECT id,TM,p12 FROM TB
UNION ALL SELECT id,TM,p13 FROM TB
UNION ALL SELECT id,TM,p14 FROM TB
UNION ALL SELECT id,TM,p15 FROM TB
UNION ALL SELECT id,TM,p16 FROM TB
UNION ALL SELECT id,TM,p17 FROM TB
UNION ALL SELECT id,TM,p18 FROM TB
UNION ALL SELECT id,TM,p19 FROM TB
UNION ALL SELECT id,TM,p20 FROM TB
UNION ALL SELECT id,TM,p21 FROM TB
UNION ALL SELECT id,TM,p22 FROM TB
UNION ALL SELECT id,TM,p23 FROM TB
UNION ALL SELECT id,TM,p0 FROM TB
UNION ALL SELECT id,TM,p1 FROM TB
UNION ALL SELECT id,TM,p2 FROM TB
UNION ALL SELECT id,TM,p3 FROM TB
UNION ALL SELECT id,TM,p4 FROM TB
UNION ALL SELECT id,TM,p5 FROM TB
UNION ALL SELECT id,TM,p6 FROM TB
UNION ALL SELECT id,TM,p7 FROM TB
) T
WHERE dateadd(hh,datediff(hh,0,TM),0)
between dateadd(hh,datediff(hh,0,@begin),0)
and dateadd(hh,datediff(hh,0,@end),0)
GROUP BY ID
net_xiaojian 2010-08-01
  • 打赏
  • 举报
回复
P19+P20...P0

时间是从2010-07-13 19点到2010-07-14 的 0点,
东那个升 2010-08-01
  • 打赏
  • 举报
回复
set @begin='2010-7-13 19:18:39' set @end='2010-7-14 0:18:59'

这样呢
net_xiaojian 2010-08-01
  • 打赏
  • 举报
回复
p0+...P18+p19
东那个升 2010-08-01
  • 打赏
  • 举报
回复
set @begin='2010-7-13 0:18:39' set @end='2010-7-14 19:18:59'


这个时间段算哪个

p0+...P18+p19么

还是
P19+P20...P0
SQLCenter 2010-08-01
  • 打赏
  • 举报
回复
我还是不看了,拿那边一哥们的和你自己的代码结合一下
declare @begin datetime                        --开始时间
declare @end datetime --结束时间
declare @num float
declare @num1 float
declare @h int --小时
declare @strsql nvarchar(4000)

set @begin='2010-7-13 21:18:39' set @end='2010-7-14 11:18:59'
--需要判断时间 输入是否准确

--将日期内的数据求和
select @num = sum(isnull(p8,0))+sum(isnull(p9,0))+sum(isnull(p10,0))+sum(isnull(p11,0))+sum(isnull(p12,0))+sum(isnull(p13,0))+sum(isnull(p14,0))+
sum(isnull(p15,0))+sum(isnull(p16,0))+sum(isnull(p17,0))+sum(isnull(p18,0))+sum(isnull(p19,0))+sum(isnull(p20,0))+sum(isnull(p21,0))+sum(isnull(p2,0))+
sum(isnull(p23,0))+sum(isnull(p0,0))+sum(isnull(p1,0))+sum(isnull(p2,0))+sum(isnull(p3,0))+sum(isnull(p4,0))+sum(isnull(p5,0))+sum(isnull(p6,0))+sum(isnull(p7,0))
from st_rain_s where tm between convert(varchar(10),@begin,120) and convert(varchar(10),@end,120)

--截头 将0点到 20点的 求和减掉
select @strsql = null, @h=datepart(hh,@begin)-1
while @h>=0
begin
set @strsql = isnull(@strsql+'+','') + 'p' + ltrim(@h)
set @h = @h - 1
end
set @strsql = 'select @num1 = ' + @strsql + ' from st_rain_s where tm = ' + convert(varchar(10),@begin,120) + ''''
exec sp_executesql @strsql, N'@num1 float output', @num1 output
set @num = @num - @num1

--截头 将12点到 23点的 求和减掉
select @strsql = null, @h=datepart(hh,@end)+1
while @h < 24
begin
set @strsql = isnull(@strsql+'+','') + 'p' + ltrim(@h)
set @h = @h + 1
end
set @strsql = 'select @num1 = ' + @strsql + ' from st_rain_s where tm = ' + convert(varchar(10),@end,120) + ''''
exec sp_executesql @strsql, N'@num1 float output', @num1 output
set @num = @num - @num1

select @num[code=SQL]
[/code]
hokor 2010-08-01
  • 打赏
  • 举报
回复
没贴好。。。重贴一下
DECLARE @TM varchar(10),@n int
SELECT @TM = '2010-07-10',@n = 19
DECLARE @SQL varchar(max)
SELECT @SQL = ISNULL(@SQL+'+','SELECT id,')+ QUOTENAME(name) FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID('tb') AND column_id >= (SELECT column_id FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID('tb') and name = 'P'+convert(varchar,@n))
SELECT @SQL = @SQL + 'AS 累计之和'+char(13)+'FROM TB WHERE convert(varchar(10),tm,120) = '''+@TM+''''
PRINT @SQL
EXEC(@SQL)
/*
SELECT id,TM,[p19]+[p20]+[p21]+[p22]+[p23]+[p0]+[p1]+[p2]+[p3]+[p4]+[p5]+[p6]+[p7]AS 累计之和
FROM TB WHERE convert(varchar(10),tm,120) = '2010-07-10'
id 累计之和
119 2340234
*/
hokor 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hokor 的回复:]
提供一种方法,但是比较费劲。。

SQL code
create table tb (id int ,TM datetime,
p8 int,
p9 int,
p10 int,
p11 int,
p12 int,
p13 int,
p14 int,
p15 int,
p16 int,
p17 ……
[/Quote] 改一下应该是sort >=
SELECT id,tm,sum(p) from #TB t where convert(varchar(10),tm,120) = '2010-07-10'  and sort >= (select top 1 sort from #tb where num = 19)
在提供一种动态SQL 的方法前面已经有人写过了。
[code=SQL]DECLARE @TM varchar(10),@n int
SELECT @TM = '2010-07-10',@n = 19
DECLARE @SQL varchar(max)
SELECT @SQL = ISNULL(@SQL+'+','SELECT id,')+ QUOTENAME(name) FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID('tb') AND column_id >= (SELECT column_id FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID('tb') and name = 'P'+convert(varchar,@n))
SELECT @SQL = @SQL + 'AS 累计之和'+char(13)+'FROM TB WHERE convert(varchar(10),tm,120) = '''+@TM+''''
PRINT @SQL
EXEC(@SQL)
/*
SELECT id,TM,[p19]+[p20]+[p21]+[p22]+[p23]+[p0]+[p1]+[p2]+[p3]+[p4]+[p5]+[p6]+[p7]AS 累计之和
FROM TB WHERE convert(varchar(10),tm,120) = '2010-07-10'
id 累计之和
119 2340234
*/


GROUP BY id,tm[/code]
net_xiaojian 2010-08-01
  • 打赏
  • 举报
回复
ls的做法看得费劲。
hokor 2010-08-01
  • 打赏
  • 举报
回复
提供一种方法,但是比较费劲。。
create table tb (id int ,TM datetime,
p8 int,
p9 int,
p10 int,
p11 int,
p12 int,
p13 int,
p14 int,
p15 int,
p16 int,
p17 int,
p18 int,
p19 int,
p20 int,
p21 int,
p22 int,
p23 int,
p0 int,
p1 int,
p2 int,
p3 int,
p4 int,
p5 int,
p6 int,
p7 int
)
insert into tb
select 118,'2010-07-14 01:00:00',1001,2002,3003,4004,5005,6006,7007,8008,9009,100010,110011,120012,130013,140014,150015,160016,170017,180018,190019,200020,210021,220022,230023,240024
union all
select 119,'2010-07-10 10:00:00',1001,2002,3003,4004,5005,6006,7007,8008,9009,100010,110011,120012,130013,140014,150015,160016,170017,180018,190019,200020,210021,220022,230023,240024

if object_id('tempdb..#tb') is not null
drop table tb

SELECT 8 num,1 sort,id,TM,p8 P into #TB FROM TB
UNION ALL SELECT 9 num,2 sort,id,TM,p9 FROM TB
UNION ALL SELECT 10 num,3 sort,id,TM,p10 FROM TB
UNION ALL SELECT 11 num,4 sort,id,TM,p11 FROM TB
UNION ALL SELECT 12 num,5 sort,id,TM,p12 FROM TB
UNION ALL SELECT 13 num,6 sort,id,TM,p13 FROM TB
UNION ALL SELECT 14 num,7 sort,id,TM,p14 FROM TB
UNION ALL SELECT 15 num,8 sort,id,TM,p15 FROM TB
UNION ALL SELECT 16 num,9 sort,id,TM,p16 FROM TB
UNION ALL SELECT 17 num,10 sort,id,TM,p17 FROM TB
UNION ALL SELECT 18 num,11 sort,id,TM,p18 FROM TB
UNION ALL SELECT 19 num,12 sort,id,TM,p19 FROM TB
UNION ALL SELECT 20 num,13 sort,id,TM,p20 FROM TB
UNION ALL SELECT 21 num,14 sort,id,TM,p21 FROM TB
UNION ALL SELECT 22 num,15 sort,id,TM,p22 FROM TB
UNION ALL SELECT 23 num,16 sort,id,TM,p23 FROM TB
UNION ALL SELECT 0 num,17 sort,id,TM,p0 FROM TB
UNION ALL SELECT 1 num,18 sort,id,TM,p1 FROM TB
UNION ALL SELECT 2 num,19 sort,id,TM,p2 FROM TB
UNION ALL SELECT 3 num,20 sort,id,TM,p3 FROM TB
UNION ALL SELECT 4 num,21 sort,id,TM,p4 FROM TB
UNION ALL SELECT 5 num,22 sort,id,TM,p5 FROM TB
UNION ALL SELECT 6 num,23 sort,id,TM,p6 FROM TB
UNION ALL SELECT 7 num,24 sort,id,TM,p7 FROM TB

SELECT id,tm,sum(p) from #TB t where convert(varchar(10),tm,120) = '2010-07-10' and sort > (select top 1 sort from #tb where num = 19)
GROUP BY id,tm
SQLCenter 2010-08-01
  • 打赏
  • 举报
回复
你想干的是什么
顺马科技从1994年涉足商业管理系统以来,已经为众多用户提供了成熟的商业管理系统,从最初的基于DOS平台的FOXPRO系统演变到现在基于WINDOWS2000、UNIX平台和SQLSERVER2000、ORACLE8i数据库系统的大型商业ERP系统,顺马ERP系统始终遵循以下两个原则: · 充分满足商场管理各方面的需要,并留有较大余地; · 尽可能降低系统造价,减轻用户负担。 顺马软件特点: 完整的进销存管理,多角度管理。系统包括供货商的信息管理、合同管理,商品的验收、退货、报损、升溢等管理,商品的销售汇总等信息的管理。 多种优惠方式的管理。包含各种促销方式如全场折扣、时段优惠、厂家折扣、套件优惠等,还可以进行单品打折、整笔打折、余额优惠等方式进行。 灵活的组网方式。可联机销售、脱网销售(单机销售)、多服务器销售(两台服务器,自动进行切换)。所有操作系统自动判断,不需人工干预。 完整的销售数据分析,包含供货商、品牌、商品分类(大类、中类、小类)、柜组、部门等方式进行商品销售分析、周转率的分析、商品库存等信息的分析。 操作方便,可根据需要定义所需的操作数据,不要的数据可自动蕴藏。 灵活的权限管理,后台系统、前台系统可运行在所有机器上,用户的操作功能进行权限控制,没个人只能看到自己有权限操作的功能。每个功能的权限可细分为增加、删除、修改、打印、查询等权限,每个权限可单独控制。所有数据可控制到字段,如可控制一个人能看到进价而另一个人不能看到进价,有些人能看第一柜组的数据,而另一些人只能看第二柜组的数据。 系统不仅仅是一个POS收银系统,而是一个完整的商业ERP管理系统,通过简单的操作实现复杂的商业管理。 操作方便。整个系统通过相同的操作界面完成不同的功能,系统风格一致,有完整的在线帮助信息。 多种会员卡管理。系统支持打折卡(不同的卡可设定不同的折扣)、会员卡(通过会员价进行销售)、购物卡(累计销售金额进行各种优惠)、储值卡(先存钱后消费,可用购物券等方式实现)、银行卡(通过银行发卡实现储值卡的功能)。 商品定制与送货。实现按客户特定要求进行商品的加工,客户信息的管理,定金、余额收款等管理。客户送货信息的管理。 完善的系统管理。对数据的完整性进行自动校验
王中王羽毛球馆管理软件介绍 一、简介 王中王羽毛球馆管理软件也称【羽毛球管理软件】【羽毛球管理系统】【羽毛球馆管理系统】【羽毛球馆管理软件】【羽毛球馆收费软件】【羽毛球馆计费软件】是一套用于羽毛球馆、羽毛球场、体育馆、网球馆、台球厅等体育场馆的专业优秀的电脑收费管理系统。该系统采用先进的dotnet开发技术,结合国内先进的管理思想和管理方法,历经2年开发而成。集POS收银收费管理,场地租金分时段分场地计费管理,场地预订,会员管理,短信预定管理、灯光控制、语音交互等强大功能为一身。能够有效的杜绝管理上的漏洞,使客户和经营者的联系更加紧密减少客户的流失,大幅度降低管理工作的工作量, 降低服务员的劳动强度节约成本,使您的经营管理变得轻松简单。持卡消费真正让客户感受到球馆的档次. 本系统适合于以下场馆使用:羽毛球馆,乒乓球馆,体育馆、体育中心,网球馆,保龄球馆, 沙狐球馆, 台球馆, 高尔夫馆, 瑜伽馆 馆,武术馆馆, 泰拳道馆馆,柔道馆馆, 健身房馆,游泳馆, 溜冰场馆,篮球场馆,足球场馆, 射击场馆, 卡丁车场馆, 滑雪场馆,潜水俱乐部馆等等 下图为自定义界面全屏显示: 二、管理特色: 王中王羽毛球管理软件跟国内其他同类相比,最大的特点是采用独创的价格规则来定义场地价格,使场地价格定义方式灵活、强大、操作非常简单。可以实现任意的您能想到的优惠方案,而设置时只需要增加一条价格规则。不像其他软件,您需要对每个场地不同时间,输入不同的价格,输到你头昏。其他的特点下面依次展开论述。 2.1场地价格定义灵活方便、功能强大。 系统出厂时已经设置了定价规则。用户可以自定义定价规则。定价规则有四个要素: ? 客户 (可以指定为全部、会员、非会员、或者通过公式指定的一部分会员) ? 场地 (可以指定全部场地、一类场地,比如羽毛球场、或者其中的几片场地、一片场地) ? 时间:可以指定为全部时间,或者部分时间:比如节假日、春节、五一、十一 ? 周末,选择时间非常方便 ? 价格,支持按小时或者按次计费缺省一次是2小时,可以参数设置一次的长短 系统可以建立无数个定价规则,规则有优先级别,级别高的规则起作用,这样理论上系统可以实现无穷个价格方案,而付出的成本却是异常低廉的,这为经营者发挥营销才能 提供了物质基础。举个例子:老板说,我要实现“过生日的会员在每天下午6点到7点打球只要10元/小时”,试问国内那个软件可以实现?而我们可以轻松实现。 您也许会说,定价规则很复杂,我不会使用怎么办?您放心。定价规则可以方便导入导出,如果您不懂设置价格规则,我们可以帮助你设置,然后把价格规则发送给你,使您解除后顾之忧。同时系统里内置规则中实现了多种收费标准,您可以随意选择使用。 2.2商品折扣定义方便灵活。 商品折扣支持简单折扣和复杂折扣。 简单折扣只要定义每个商品的会员价和零售价。 复杂折扣可以根据 时间【平时,闲时,白天、晚上】 客人【所以人,会员、非会员、一部分会员】 商品【全部商品、部分商品、部分商品类别】 数量的不同而使用不同的折扣。可以方便的实现开业优惠、节日促销。 可以实现的典型的优惠方案: 开业五折优惠 购买可口可乐5瓶以上10瓶以内打8折 金卡会员晚上8点到10点购买脉动可以达8.6折。 2.3场地预定简单、方便。 系统支持临时、每日、每周三种类型的预定,每日、每周预订只要录入一次、到时间会自动显示在界面上、场地的状态图会自动显示场地已经被预订、过了预订时间后场地的状态又会自动还原。提供史上最强大的图形查询界面,可以按日、按周、按月查询预订信息。预订人可以临时取消不来,操作灵活。支持球票管理,出售球票时自动产生预订。开场时无需付款. 2.4界面美观大方全键盘操作 (不用鼠标也能操作),多达26多种皮肤,100%满足您的个性要求。 2.5强大的优惠卡管理功能。 支持四种类型的优惠卡。 按次计算的优惠卡:比如300元10次卡(每次1小时) 按时间计算的优惠卡 :比如500元20小时卡, 现金充值卡:面值1000元,售价800元,相当于打八折 包时卡:如:包打一年1000元 支持优惠卡新卡登记、优惠卡销售、优惠卡充值功能。 2.6强大的会员管理 支持会员照片、支持摄像头照相。 支持会员充值、转账 会员消费查询 会员密码,设置密码后,不用带卡也可以消费 支持会员组概念,系统提供了很多公式,可以方便快速 对会员分组,比如: 20岁以上50以下会员 积分大于1000的会员 今天过生日的会员 累计消费超过10000元的会员 余额超过5000元的会员 入会超过2年的老顾客 通过分组,可以实现复杂的收费规则,而实现起来却非常简单 会员卡支持磁卡、ID卡、IC卡、MF1卡(非接触IC卡)多种介质 目前支持深圳方卡M1读卡机,常州银联M

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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