怎么样能达到这个效果

loen113 2008-06-13 10:13:57
表A
客户 编号 货号 规格 数量 重量 物料 数量 单价 金额
A 123 LH001 20*2 10 12 123-1 0.1 10 1
A 123 LH001 20*2 23 11 123-1 2 15 30
A 123 LH001 20*2 43 15 123-1 0.5 10 5
B 567 LH003 10*5 10 21 321 1.1 10 11
B 567 LH003 10*5 40 34 321 1.6 10 16



想达到以下这种效果

客户 编号 货号 规格 数量 重量 物料 数量 单价 金额
A 123 LH001 20*2 10 12 123-1 0.1 10 1
A 123 LH001 20*2 23 11 123-1 2 15 30
A 123 LH001 20*2 43 15 123-1 0.5 10 5
合计 2.6 36
B 567 LH003 10*5 10 21 321 1.1 10 11
B 567 LH003 10*5 40 34 321 1.6 10 16
合计 2.7 27



行数都不固定的.按规格来求....麻烦各位了






...全文
101 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
火星求索 2008-06-14
  • 打赏
  • 举报
回复
你的数据

--> 测试数据: #T1
if object_id('tempdb.dbo.#T1') is not null drop table #T1
create table #T1 ([客户] varchar(1),[编号] int,[货号] varchar(5),[规格] varchar(4),[数] int,[重量] int,[物料] varchar(5),[数量] numeric(2,1),[单价] int,[金额] int)
insert into #T1
select 'A',123,'LH001','20*2',10,12,'123-1',0.1,10,1 union all
select 'A',123,'LH001','20*2',23,11,'123-1',2,15,30 union all
select 'A',123,'LH001','20*2',43,15,'123-1',0.5,10,5 union all
select 'B',567,'LH003','10*5',10,21,'321',1.1,10,11 union all
select 'B',567,'LH003','10*5',40,34,'321',1.6,10,16


select 客户=case when n=1 then '总计' when s=1 then '小计' else 客户 end,编号,货号,规格,数,重量,物料,数量,单价,金额
from
(select 客户,编号,货号,规格,数,重量,物料,数量=sum(数量),单价=avg(单价),金额=sum(金额),GROUPING(客户)n
,GROUPING(编号)s
from #T1
group by 客户,编号,货号,规格,数,重量,物料
with rollup) a
where 物料 is not null or
n=1 or s=1

drop table #T1
/*
客户 编号 货号 规格 数 重量 物料 数量 单价 金额
---- ----------- ----- ---- ----------- ----------- ----- --------------------------------------- ----------- -----------
A 123 LH001 20*2 10 12 123-1 0.1 10 1
A 123 LH001 20*2 23 11 123-1 2.0 15 30
A 123 LH001 20*2 43 15 123-1 0.5 10 5
小计 NULL NULL NULL NULL NULL NULL 2.6 11 36
B 567 LH003 10*5 10 21 321 1.1 10 11
B 567 LH003 10*5 40 34 321 1.6 10 16
小计 NULL NULL NULL NULL NULL NULL 2.7 10 27
总计 NULL NULL NULL NULL NULL NULL 5.3 11 63
*/
Andy-W 2008-06-14
  • 打赏
  • 举报
回复
楼主可以参考:
http://topic.csdn.net/u/20080609/10/699ddc55-29ea-4773-9d87-7aaba32e67d7.html

相似的问题

--> --> (Andy)生成測試數據
Set Nocount On
declare @1 table([c1] nvarchar(3),[c2] nvarchar(2),[c3] nvarchar(3),[c4] int)
Insert @1
select N'单位A',N'批发',N'商品A',100 union all
select N'单位A',N'直销',N'商品B',100 union all
select N'单位B',N'批发',N'商品D',100 union all
select N'单位C',N'直销',N'商品E',100 union all
select N'单位A',N'批发',N'商品C',100 union all
select N'单位D',N'直销',N'商品F',100 union all
select N'单位C',N'批发',N'商品M',100
Select
[dw(单位)]=Case When c1 Is null And c3 Is null And c2 Is Not null Then c2+'小计' When c1 Is null Then '合计' Else c1 End,
[方式]=Case When c1 Is null And c3 Is null Then null Else c2 End,
[商品]=c3,
[数量]=SUM(c4)
From @1
Group By c2,c1,c3 With ROLLUP
Having (c1+c2+c3+Rtrim(SUM(c4))>'') Or (c1 Is null And c3 Is null)

/*
dw(单位) 方式 商品 数量
------ ---- ---- -----------
单位A 批发 商品A 100
单位A 批发 商品C 100
单位B 批发 商品D 100
单位C 批发 商品M 100
批发小计 NULL NULL 400
单位A 直销 商品B 100
单位C 直销 商品E 100
单位D 直销 商品F 100
直销小计 NULL NULL 300
合计 NULL NULL 700


*/
火星求索 2008-06-14
  • 打赏
  • 举报
回复

declare @t table(单据编号 varchar(10),商品编码 varchar(10),商品名称 varchar(10),进货数量 int,成本价 money,金额 money)
insert into @t select 'JH001','0001','营养快线',10,3.5,35
insert into @t select 'JH001','0002','AD钙奶',5,6,30
insert into @t select 'JH002','0001','营养快线',5,3.5,17.5
insert into @t select 'JH002','0002','AD钙奶',30,6,180
select 单据编号=case when n=1 then '总计' when s=1 then '小计' else 单据编号 end,商品编码,商品名称,进货数量,成本价,金额
from
(select 单据编号,商品编码,商品名称,进货数量=sum(进货数量),成本价=sum(成本价),金额=sum(金额),GROUPING(单据编号)n
,GROUPING(商品编码)s
from @t
group by 单据编号,商品编码,商品名称
with rollup) a
where 商品名称 is not null
or n=1 or s=1
/*

单据编号 商品编码 商品名称 进货数量 成本价 金额
---------- ---------- ---------- ----------- --------------------- ---------------------
JH001 0001 营养快线 10 3.50 35.00
JH001 0002 AD钙奶 5 6.00 30.00
小计 NULL NULL 15 9.50 65.00
JH002 0001 营养快线 5 3.50 17.50
JH002 0002 AD钙奶 30 6.00 180.00
小计 NULL NULL 35 9.50 197.50
总计 NULL NULL 50 19.00 262.50
*/
火星求索 2008-06-14
  • 打赏
  • 举报
回复
小计与总计

--小计与总计的汇总
declare @t table(name varchar(20),Num int)
insert into @t select 'a',1
insert into @t select 'a',2
insert into @t select 'b',3
insert into @t select 'b',4
select name=(case when name is null then 'total' else name end),Num from
(SELECT name, SUM(Num) as Num,GROUPING(name) 'grp' FROM @t
GROUP BY name WITH ROLLUP) t


--实例
declare @t table(单据编号varchar(10),商品编码varchar(10),商品名称varchar(10),进货数量int,成本价money,金额money)
insert into @t select 'JH001','0001','营养快线',10,3.5,35
insert into @t select 'JH001','0002','AD钙奶',5,6,30
insert into @t select 'JH002','0001','营养快线',5,3.5,17.5
insert into @t select 'JH002','0002','AD钙奶',30,6,180
select 单据编号=case when n=1 then '总计' when s=1 then '小计' else 单据编号end,商品编码,商品名称,进货数量,成本价,金额
from
(select 单据编号,商品编码,商品名称,进货数量=sum(进货数量),成本价=sum(成本价),金额=sum(金额),GROUPING(单据编号)n
,GROUPING(商品编码)s
from @t
group by 单据编号,商品编码,商品名称
with rollup)a
where 商品名称is not null
or n=1 or s=1

hery2002 2008-06-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fcuandy 的回复:]
SQL codeDECLARE @n TABLE(cid INT,n INT)
INSERT @n SELECT 1,1
UNION ALL SELECT 1,2
UNION ALL SELECT 1,3
UNION ALL SELECT 2,4
UNION ALL SELECT 2,6

SELECT cid,n FROM @n ORDER BY cid COMPUTE MIN(cid),SUM(n) BY cid



但注意,结果不是一个行集. 用来查看数据明细和汇总足够用了。


如果希望产生一个结果集,那么可以使用连接或联合查询,但是写法就稍复杂了,这样,还是推荐在前台程序里做。
[/Quote]
前台做,
SQL做出来效果也不理想.
lff642 2008-06-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangCK 的回复:]
这种.在报表里做更好.
[/Quote]

支持.
fcuandy 2008-06-14
  • 打赏
  • 举报
回复
if object_id('tempdb.dbo.#T1') is not null drop table #T1
create table #T1 ([客户] varchar(1),[编号] int,[货号] varchar(5),[规格] varchar(4),[数] int,[重量] int,[物料] varchar(5),[数量] numeric(2,1),[单价] int,[金额] int)
insert into #T1
select 'A',123,'LH001','20*2',10,12,'123-1',0.1,10,1 union all
select 'A',123,'LH001','20*2',23,11,'123-1',2,15,30 union all
select 'A',123,'LH001','20*2',43,15,'123-1',0.5,10,5 union all
select 'B',567,'LH003','10*5',10,21,'321',1.1,10,11 union all
select 'B',567,'LH003','10*5',40,34,'321',1.6,10,16

SELECT CASE WHEN idx=1 THEN '小计' ELSE n END 客户,
编号,货号,规格,数,重量,物料,数量,单价,金额
FROM
(
SELECT 客户 n,货号,编号,规格,数,重量,物料,数量,单价,金额,idx=0 FROM #t1
UNION ALL
SELECT 客户,NULL ,NULL ,NULL ,NULL ,NULL , NULL ,SUM(数量),NULL,SUM(金额),idx=1 FROM #t1 GROUP BY 客户
) x
ORDER BY n,idx


前台程序实现方法是多样的,我不清楚楼主DBGRIDEH是什么开发环境里的,我以c#为例
1,得到结果集(单个),放入datatable中,自己写算实现统计,然后插入新行。 再绑定到数据显示控件中.
2,得到结果集(多个), 放入dataset中,循环importrow,将多个datatable结果整合到一个datatable中,再绑定到数据显示控件.
3,如果是b/s程序,花样就更多了,比如js+dhtml实现,或者纯xsl控制报表格式,都很方便
4,其它方式当然还有,我不一一写了。
-晴天 2008-06-13
  • 打赏
  • 举报
回复
select 客户,编号,货号,规格,重量,物料,数量,单价,金额 from table
order by 客户,编号,货号,规格
compute sum(数量),sum(金额) by 客户,编号,货号,规格
duanzhi1984 2008-06-13
  • 打赏
  • 举报
回复
用union all

select 客户,编号,货号, 规格,数量,重量,物料,数量,单价,金额 from table
union all
slect '','','', '',0,0,0,'','',sum(单价),sum(金额) from table group by 客户...


自己处理下吧
大概的思路
loen113 2008-06-13
  • 打赏
  • 举报
回复
前台里面该怎么做呢我用的是DBGRIDEH控制
fcuandy 2008-06-13
  • 打赏
  • 举报
回复
DECLARE @n TABLE(cid INT,n INT)
INSERT @n SELECT 1,1
UNION ALL SELECT 1,2
UNION ALL SELECT 1,3
UNION ALL SELECT 2,4
UNION ALL SELECT 2,6

SELECT cid,n FROM @n ORDER BY cid COMPUTE MIN(cid),SUM(n) BY cid


但注意,结果不是一个行集. 用来查看数据明细和汇总足够用了。


如果希望产生一个结果集,那么可以使用连接或联合查询,但是写法就稍复杂了,这样,还是推荐在前台程序里做。
liangCK 2008-06-13
  • 打赏
  • 举报
回复
这种.在报表里做更好.

22,298

社区成员

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

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