涉及天数的小计问题

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)该如何写?
...全文
76 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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)

34,623

社区成员

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

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