涉及天数的小计问题

echo_llee 2001-12-05 02:50:05
若数据结构如下:
dtime name shop amount
2001-12-1 13:00:23 王 铅笔 10
2001-12-1 14:12:22 王 钢笔 20
2001-12-1 16:02:00 王 铅笔 10
2001-12-1 17:00:23 李 铅笔 10
2001-12-1 18:12:22 李 钢笔 10
2001-12-2 19:02:00 王 铅笔 10
2001-12-2 16:02:00 王 毛笔 10
2001-12-2 17:00:23 李 铅笔 10
现要得到如下结果:
dtime name amount
2001-12-1 王 40
2001-12-1 李 20
小计 60
2001-12-2 王 20
2001-12-2 李 10
小计 30
合计 90
请问用一句sql(sql server2000)该如何写?
...全文
63 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
echo_llee 2001-12-06
  • 打赏
  • 举报
回复
谢谢灵胡,你的方法确实管用。不过,在下还有一个问题不明白,不知能否向你请教?
若我把
convert(varchar,day(dtime))+'-'+convert(varchar,month(dtime))+'-'
+convert(varchar,year(dtime))
替换成convert(varchar,left(dtime,10),102)进行小计时,sql老提示dtime未进行group by运算,我不知这是怎么回事?
echo_llee 2001-12-06
  • 打赏
  • 举报
回复
我明白了,当我将convert(varchar,left(dtime,10),102)(或convert(varchar,day(dtime))+'-'+convert(varchar,month(dtime))+'-'+convert(varchar,year(dtime))) 进行小计,并如name的处理方式一样,进行分别给值时,sql并不认为convert(varchar,left(dtime,10),102)是一个整体,而是拆分开来,因而他找不到dtime的具体值,所以取值应是max (or min).
killingfield 2001-12-05
  • 打赏
  • 举报
回复
请注意:
--日期的格式有点不相符合,调整一下即可
--小计的日期无法去掉,应该不影响大局
--给分吧,呵呵
killingfield 2001-12-05
  • 打赏
  • 举报
回复
select
convert(varchar,day(dtime))+'-'+convert(varchar,month(dtime))+'-'
+convert(varchar,year(dtime)) as dtime,

name=
case
when(grouping(convert(varchar,day(dtime))+'-'+convert(varchar,month (dtime))+'-'+convert(varchar,year(dtime)))=1) then '合计'
else isnull(name,'小计')
end,

sum(amount) as amount
from test
group by convert(varchar,day(dtime))+'-'+convert(varchar,month(dtime))+
'-'+convert(varchar,year(dtime)),
name
with rollup
echo_llee 2001-12-05
  • 打赏
  • 举报
回复
问题是小计时并不是单纯按dtime字段小计,而是取其前十位即直到天而不是到秒进行小计。这才是问题的关键所在。该怎么写呢?
net_steven 2001-12-05
  • 打赏
  • 举报
回复
参考rollup 运算符:
-------------------------------------------------------------------
Item Color Quantity
-------------------- -------------------- --------------------------
Table Blue 124
Table Red 223
Chair Blue 101
Chair Red 210

下列查询将生成小计报表:

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
ELSE ISNULL(Item, 'UNKNOWN')
END AS Item,
CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
ELSE ISNULL(Color, 'UNKNOWN')
END AS Color,
SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH ROLLUP

Item Color QtySum
-------------------- -------------------- --------------------------
Chair Blue 101.00
Chair Red 210.00
Chair ALL 311.00
Table Blue 124.00
Table Red 223.00
Table ALL 347.00
ALL ALL 658.00

(7 row(s) affected)

相关推荐
发帖
MS-SQL Server

3.4w+

社区成员

MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
帖子事件
创建了帖子
2001-12-05 02:50
社区公告
暂无公告