一个大家常用的统计语句,求SQL语句,谢谢!

plutu 2011-02-27 11:15:47
一家销售公司设北京和上海两家分公司销售产品,为了描述方便,字段用汉字,表结构和销售明细如下:
CREATE TABLE Test(日期 smalldatetime,销售公司 char (10),产品名称 char(10),销售额 smallint)
GO
insert into test
select
'2011-02-01 ','北京公司','甲产品',1 union all select
'2011-02-01 ','北京公司','乙产品',2 union all select
'2011-02-01 ','上海公司','甲产品',3 union all select
'2011-02-01 ','上海公司','乙产品',4 union all select
'2011-02-02 ','北京公司','甲产品',5 union all select
'2011-02-02 ','北京公司','乙产品',6 union all select
'2011-02-02 ','上海公司','甲产品',7 union all select
'2011-02-03 ','北京公司','乙产品',8 union all select
'2011-02-03 ','上海公司','乙产品',9 union all select
'2011-02-03 ','上海公司','丙产品',10



日期 销售公司 产品名称 销售额
---------- ---------- -------- ------
2011-02-01 北京公司 甲产品 1
2011-02-01 北京公司 乙产品 2
2011-02-01 上海公司 甲产品 3
2011-02-01 上海公司 乙产品 4
2011-02-02 北京公司 甲产品 5
2011-02-02 北京公司 乙产品 6
2011-02-02 上海公司 甲产品 7
2011-02-03 北京公司 乙产品 8
2011-02-03 上海公司 乙产品 9
2011-02-03 上海公司 丙产品 10

现在要统计2011-02-03的日报,需要分别统计北京公司和上海公司对按照汇总,所列产品为本月分公司曾销售过的,比如北京公司2011年2月3日甲产品没有销售额,但前几天曾销售过,这样也统计上,结果如下,需求SQL语句:


销售公司 产品名称 销售额 本日止累计
---------- -------- ------ --------
北京公司 甲产品 0 6
乙产品 8 16
当日合计 8 22
上海公司 甲产品 0 10
乙产品 9 13
丙产品 10 10
当日合计 19 33
总合计 27 55
...全文
134 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2011-02-28
  • 打赏
  • 举报
回复
CREATE TABLE TEST
(
日期 SMALLDATETIME,
销售公司 CHAR (10),
产品名称 CHAR(10),
销售额 SMALLINT
)
INSERT TEST
SELECT '2011-02-01 ','北京公司','甲产品',1 union all
SELECT '2011-02-01 ','北京公司','乙产品',2 union all
SELECT '2011-02-01 ','上海公司','甲产品',3 union all
SELECT '2011-02-01 ','上海公司','乙产品',4 union all
SELECT '2011-02-02 ','北京公司','甲产品',5 union all
SELECT '2011-02-02 ','北京公司','乙产品',6 union all
SELECT '2011-02-02 ','上海公司','甲产品',7 union all
SELECT '2011-02-03 ','北京公司','乙产品',8 union all
SELECT '2011-02-03 ','上海公司','乙产品',9 union all
SELECT '2011-02-03 ','上海公司','丙产品',10
GO

--SQL
DECLARE @date DATETIME
SET @date = '2011-02-03 00:00:00'

SELECT
销售公司 = (CASE WHEN GROUPING(销售公司) = 0 THEN 销售公司 ELSE '公司合计' END),
产品名称 = (CASE WHEN GROUPING(产品名称) = 0 THEN 产品名称 WHEN GROUPING(销售公司) = 0 THEN '当日合计' ELSE '总合计' END),
销售额 = SUM(CASE WHEN 日期 = @date THEN 销售额 ELSE 0 END),
本日止累计 = SUM(销售额)
FROM Test a
WHERE 日期 <= @date
GROUP BY 销售公司, 产品名称
WITH ROLLUP
--RESULT
/*
销售公司 产品名称 销售额 本日止累计
北京公司 甲产品 0 6
北京公司 乙产品 8 16
北京公司 当日合计 8 22
上海公司 丙产品 10 10
上海公司 甲产品 0 10
上海公司 乙产品 9 13
上海公司 当日合计 19 33
公司合计 总合计 27 55
*/
plutu 2011-02-28
  • 打赏
  • 举报
回复
若要是再增加一个分公司的销售团队呢?比如要出考核报表,数据增加了一列
CREATE TABLE TEST
(
日期 SMALLDATETIME,
销售公司 CHAR (10),
产品名称 CHAR(10),
销售额 SMALLINT,
销售团队 CHAR(12)
)

INSERT TEST
SELECT '2011-02-01 ','北京公司','甲产品',1,'A团队' union all
SELECT '2011-02-01 ','北京公司','乙产品',2,'B团队' union all
SELECT '2011-02-01 ','上海公司','甲产品',3,'B团队' union all
SELECT '2011-02-01 ','上海公司','乙产品',4,'A团队' union all
SELECT '2011-02-02 ','北京公司','甲产品',5,'B团队' union all
SELECT '2011-02-02 ','北京公司','乙产品',6,'A团队' union all
SELECT '2011-02-02 ','上海公司','甲产品',7,'A团队' union all
SELECT '2011-02-03 ','北京公司','乙产品',8,'B团队' union all
SELECT '2011-02-03 ','上海公司','乙产品',9,'A团队' union all
SELECT '2011-02-03 ','上海公司','丙产品',10,'A团队'
plutu 2011-02-28
  • 打赏
  • 举报
回复
谢谢楼上的,我在你发帖之前已经结贴了,没法给你散分了,谢谢!
plutu 2011-02-27
  • 打赏
  • 举报
回复
晚安,谢谢,结贴!
快溜 2011-02-27
  • 打赏
  • 举报
回复
select 销售公司,产品名称,
销售额=(select sum(销售额) from Test where 销售公司=a.销售公司 and 产品名称=a.产品名称 and 日期='2011-02-03'),
本日止累计=(select sum(销售额) from Test where 销售公司=a.销售公司 and 产品名称=a.产品名称 and 日期<='2011-02-03') into #cte
from test a group by 销售公司,产品名称


select * from #cte
union all
select 销售公司,'当日合计' as 产品名称,sum(销售额) as 销售额,sum(本日止累计) as 本日止累计 from #cte group by 销售公司
union all
select 'zzzzzzz','总合计' as 产品名称,sum(销售额),sum(本日止累计) from #cte
order by 销售公司,产品名称 desc

洗洗睡吧,晚安。
plutu 2011-02-27
  • 打赏
  • 举报
回复
谢谢,只有公司顺序稍有差别
快溜 2011-02-27
  • 打赏
  • 举报
回复
select 销售公司,产品名称,
销售额=(select sum(销售额) from Test where 销售公司=a.销售公司 and 产品名称=a.产品名称 and 日期='2011-02-03'),
本日止累计=(select sum(销售额) from Test where 销售公司=a.销售公司 and 产品名称=a.产品名称 and 日期<='2011-02-03') into #cte
from test a group by 销售公司,产品名称


select * from #cte
union all
select 销售公司,'当日合计' as 产品名称,sum(销售额) as 销售额,sum(本日止累计) as 本日止累计 from #cte group by 销售公司
union all
select null,'总合计' as 产品名称,sum(销售额),sum(本日止累计) from #cte
order by 销售公司 desc,产品名称 desc
plutu 2011-02-27
  • 打赏
  • 举报
回复
先谢谢楼上的,楼上的2005的,我用的是SQL Server2000,请按照2000的格式写,谢谢!
快溜 2011-02-27
  • 打赏
  • 举报
回复
with cte as
(
select 销售公司,产品名称,
销售额=(select sum(销售额) from Test where 销售公司=a.销售公司 and 产品名称=a.产品名称 and 日期='2011-02-03'),
本日止累计=(select sum(销售额) from Test where 销售公司=a.销售公司 and 产品名称=a.产品名称 and 日期<='2011-02-03')
from test a group by 销售公司,产品名称
)

select * from cte
union all
select 销售公司,'当日合计' as 产品名称,sum(销售额) as 销售额,sum(本日止累计) as 本日止累计 from cte group by 销售公司
union all
select null,'总合计' as 产品名称,sum(销售额),sum(本日止累计) from cte
order by 销售公司 desc,产品名称 desc
plutu 2011-02-27
  • 打赏
  • 举报
回复
先休息吧,谢谢!寻求的结果就是下列表test1中的内容:
CREATE TABLE Test1(销售公司 char (10),产品名称 char(10),销售额 smallint,本日止累计 smallint)
GO
insert into test1
select
'北京公司','甲产品',0,6 union all select
'北京公司','乙产品',8,16 union all select
'北京公司','当日合计',8,22 union all select
'上海公司','甲产品',0,10 union all select
'上海公司','乙产品',9,13 union all select
'上海公司','丙产品',10,10 union all select
'上海公司','当日合计',19,33union all select
'公司合计','总合计',27,55
喜-喜 2011-02-27
  • 打赏
  • 举报
回复
喝晕了!只能占沙发喽!呵呵......

27,579

社区成员

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

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