--建立测试环境
Create Table 表(客户名称 varchar(10),产品名称 varchar(10),规格 varchar(10),金额 int)
--插入数据
insert into 表
select 'A客户','A名称','A规格','100' union
select 'B客户','A名称','A规格','200' union
select 'A客户','c名称','c规格','100' union
select 'B客户','b名称','b规格','800' union
select 'B客户','d名称','d规格','1000'--测试语句
select *,客户名称 as 排序列 from 表
union
select '合计','','',sum(金额),客户名称 from 表 group by 客户名称
order by 客户名称
--删除测试环境
Drop Table 表
Create Table 表(客户名称 varchar(10),产品名称 varchar(10),规格 varchar(10),金额 int)
--插入数据
insert into 表
select 'A客户','A名称','A规格','100' union
select 'B客户','A名称','A规格','200' union
select 'A客户','c名称','c规格','100' union
select 'B客户','b名称','b规格','800' union
select 'B客户','d名称','d规格','1000'--测试语句
select *,客户名称 as 排序列 from 表
union
select '合计','','',sum(金额),客户名称 from 表 group by 客户名称
order by 客户名称
--删除测试环境
Drop Table 表
(
客户名称 varchar(20),
产品名称 varchar(20),
规格 varchar(20),
金额 int
)
insert @tb
select 'A客户', 'A名称', 'A规格', 100 union
select 'B客户', 'A名称', 'A规格', 200 union
select 'A客户', 'c名称', 'c规格', 100 union
select 'B客户', 'b名称', 'b规格', 800 union
select 'B客户', 'd名称', 'd规格', 1000--查询
select (case when grouping(产品名称)=1 and grouping(客户名称)=1
then '总计'
when grouping(产品名称)=1
then 客户名称+'合计'
else 客户名称
end) as '客户名称'
,isnull(产品名称,'') as '产品名称'
,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
,max(金额) as '金额'
from @tb t
group by 客户名称,产品名称
with rollup
order by 客户名称,产品名称--结果
/*
客户名称 产品名称 规格 金额
------------------------ -------------------- -------------------- -----------
A客户 A名称 A规格 100
A客户 c名称 c规格 100
A客户合计 100
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
B客户合计 1000
总计
*/
(
客户名称 varchar(20),
产品名称 varchar(20),
规格 varchar(20),
金额 int
)
insert @tb
select 'A客户', 'A名称', 'A规格', 100 union
select 'B客户', 'A名称', 'A规格', 200 union
select 'A客户', 'c名称', 'c规格', 100 union
select 'B客户', 'b名称', 'b规格', 800 union
select 'B客户', 'd名称', 'd规格', 1000--查询
select (case when grouping(产品名称)=1 and grouping(客户名称)=1
then '总计'
when grouping(产品名称)=1
then 客户名称+'合计'
else 客户名称
end) as '客户名称'
,isnull(产品名称,'') as '产品名称'
,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
,sum(金额) as '金额'
from @tb t
group by 客户名称,产品名称
with rollup
order by 客户名称,产品名称--结果
/*
客户名称 产品名称 规格 金额
------------------------ -------------------- -------------------- -----------
A客户 A名称 A规格 100
A客户 c名称 c规格 100
A客户合计 100
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
B客户合计 1000
总计
*/
(
客户名称 varchar(20),
产品名称 varchar(20),
规格 varchar(20),
金额 int
)
insert @tb
select 'A客户', 'A名称', 'A规格', 100 union
select 'B客户', 'A名称', 'A规格', 200 union
select 'A客户', 'c名称', 'c规格', 100 union
select 'B客户', 'b名称', 'b规格', 800 union
select 'B客户', 'd名称', 'd规格', 1000--查询
select (case when grouping(产品名称)=1 and grouping(客户名称)=1
then '总计'
when grouping(产品名称)=1
then 客户名称+'合计'
else 客户名称
end) as '客户名称'
,isnull(产品名称,'') as '产品名称'
,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
,sum(金额) as '金额'
from @tb t
group by 客户名称,产品名称
with rollup
order by 客户名称,产品名称--结果
/*
客户名称 产品名称 规格 金额
------------------------ -------------------- -------------------- -----------
A客户 A名称 A规格 100
A客户 c名称 c规格 100
A客户合计 200
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
B客户合计 2000
总计 2200
*/
客户名称 + 产品名称 + 规格 是唯一的 也就是同一个客户 + 产品名称 + 规格 只有一个金额。 我觉得产品名称和规格应该是同一重要性。 为什么
(case when grouping(产品名称)=1 and grouping(客户名称)=1
then '总计'
when grouping(产品名称)=1
then 客户名称+'合计'
else 客户名称
end) as '客户名称'
,isnull(产品名称,'') as '产品名称'从这里看 他们的重要性不一样呀 ???
A客户 A名称 B规格 200
B客户 A名称 A规格 200
A客户 c名称 c规格 100
B客户 b名称 b规格 800
B客户 d名称 d规格 1000我想统计的结果是(其实就是按客户分类统计)
A客户 A名称 A规格 100
A客户 A名称 B规格 200
A客户 c名称 c规格 100
合计: 400
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
合计: 2000
总计: 2400上面的高手写的好像不行的
(
客户名称 varchar(20),
产品名称 varchar(20),
规格 varchar(20),
金额 int
)
insert @tb
select 'A客户', 'A名称', 'A规格', 100 union
select 'A客户', 'B名称', 'B规格', 200 union
select 'B客户', 'A名称', 'A规格', 200 union
select 'A客户', 'c名称', 'c规格', 100 union
select 'B客户', 'b名称', 'b规格', 800 union
select 'B客户', 'd名称', 'd规格', 1000--查询
select (case when grouping(产品名称)=1 and grouping(客户名称)=1
then '总计'
when grouping(产品名称)=1
then 客户名称+'合计'
else 客户名称
end) as '客户名称'
,isnull(产品名称,'') as '产品名称'
,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
,sum(金额) as '金额'
from @tb t
group by 客户名称,产品名称
with rollup
order by 客户名称,产品名称--结果
/*
客户名称 产品名称 规格 金额
------------------------ -------------------- -------------------- -----------
A客户 A名称 A规格 100
A客户 B名称 B规格 200
A客户 c名称 c规格 100
A客户合计 400
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
B客户合计 2000
总计 2400
*/
select 客户名称,产品名称,规格
,sum(金额) as '金额'
from @tb t
group by 客户名称,产品名称,规格
with rollup
order by 客户名称,产品名称,规格
Select 客户名称,产品名称,规格,金额 From table
Order By 客户名称
Compute sum(金额) By 客户名称
Compute sum(金额)
那按照 :
A客户 A名称 A规格 100
A客户 A名称 B规格 200
B客户 A名称 A规格 200
A客户 c名称 c规格 100
B客户 b名称 b规格 800
B客户 d名称 d规格 1000我想统计的结果是(其实就是按客户分类统计)
A客户 A名称 A规格 100
A客户 A名称 B规格 200
A客户 c名称 c规格 100
合计: 400
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
合计: 2000
总计: 2400这样的统计 可以统计出来吗 ?????????
A客户 A名称 B规格 200
A客户 c名称 c规格 100
合计: 400
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
合计: 2000vivianfdlpw() 的语句可以达到以上结果。
要知其所以然三,例子讲的很好
select (case when grouping(产品名称)=1 and grouping(客户名称)=1
then '合计'
when grouping(产品名称)=1
then 客户名称+'合计'
else 客户名称
end) as '客户名称'
,isnull(产品名称,'') as '产品名称'
,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
,max(金额) as '金额'
from @tb t
group by 客户名称,产品名称
with rollupunion all
select '总计','','',sum(金额) from @tb
(
客户名称 varchar(20),
产品名称 varchar(20),
规格 varchar(20),
金额 int
)
insert @tb
select 'A客户', 'A名称', 'A规格', 100 union
select 'A客户', 'A名称', 'B规格', 200 union
select 'B客户', 'A名称', 'A规格', 200 union
select 'A客户', 'c名称', 'c规格', 100 union
select 'B客户', 'b名称', 'b规格', 800 union
select 'B客户', 'd名称', 'd规格', 1000--查询
select (case when grouping(产品名称)=1 and grouping(客户名称)=1
then '总计'
when grouping(产品名称)=1
then 客户名称+'合计'
else 客户名称
end) as '客户名称'
,isnull(产品名称,'') as '产品名称'
,(case when grouping(产品名称)=1 then '' else max(规格) end) as '规格'
,sum(金额) as '金额'
from @tb t
group by 客户名称,产品名称
with rollup
order by 客户名称,产品名称
得到的结果是
A客户 A名称 B规格 300
A客户 c名称 c规格 100
A客户合计 400
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
B客户合计 2000
总计 2400
而不是 我要的
A客户 A名称 A规格 100
A客户 A名称 B规格 200
A客户 c名称 c规格 100
A客户合计 400
B客户 A名称 A规格 200
B客户 b名称 b规格 800
B客户 d名称 d规格 1000
B客户合计 2000
总计 2400
(
客户名称 varchar(20),
产品名称 varchar(20),
规格 varchar(20),
金额 int
)
insert @tb
select 'A客户', 'A名称', 'A规格', 100 union
select 'A客户', 'A名称', 'B规格', 200 union
select 'B客户', 'A名称', 'A规格', 200 union
select 'A客户', 'c名称', 'c规格', 100 union
select 'B客户', 'b名称', 'b规格', 800 union
select 'B客户', 'd名称', 'd规格', 1000
select * from (select * from @tb
union all
select 客户名称+'合计','' as 产品名称,'' as 规格,sum(金额) as 金额 from @tb group by 客户名称
union all
select '总计'as 客户名称,'' as 产品名称,'' as 规格,sum(金额)as 金额 from @tb ) T
order by 客户名称