数据库sql的查询统计问题 用存储过程实现;

我有两个表,一个是主表如下所示
编号 类型 单位编码
001  A   A001
002  B A001
003  C A003
004  A A002
005  A A003
.....................
明细表如下:
编号  名称   批号
001   汽车   1001
001   自行车  1003
002   汽车   1004
001   汽车   1005
001   自行车  1006
001   卡车   1007
002   卡车   1008
......................
要实现以下功能,用主表的编号联接明细表后实现以下统计:
单位编码  汽车 自动车 卡车..........
A001     2   1  1
A002     1   0  0
A001+A002   3   1  1
A003     1   0  0
合计     4   1  1
如何实现啊大家帮帮我啊!

抄了个例句,你参考参考吧
SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year

我教你,要知道作为一个程序,考虑到数据的多变性,灵活是至关重要的,还是拿上次的就基本上可以了:
我教你,要知道作为一个程序,考虑到数据的多变性,灵活是至关重要的,还是拿上次的就基本上可以了:

declare @SQL varchar(2000)
declare @SQLSel varchar(200)
declare @SQLPart1 varchar(200)
declare @SQLPart2 varchar(200)
declare @Part varchar(20)
declare @Name varchar(20)--机动车名称变量
if exists(select * from tempdb..sysobjects where name='##temp1')
drop table ##temp1
create table ##temp1 (AutoID int identity(1,1),Part Varchar(20))
Insert Into ##Temp1(Part) Select Distinct Part From Table1
Set @SQLPart1=''
Set @SQLSel=''
--建立游标,将机动车名称加到临时表的字段中,顺便建立你最后需要的合并SQL语句,因为你的排序需要,所以第一次只能是对A001和A002了
DECLARE abc CURSOR FOR select distinct B.名称 FROM 主表 A Inner Join 明细表 B On A.编号=B.编号 Where 单位编码 In('A001','A002')
OPEN abc
FETCH NEXT FROM abc INTO @Name
WHILE (@@FETCH_STATUS = 0) begin
Set @SQLSel=@SQLSel+',['+@Name+']'
Set @SQLPart1=@SQLPart1+',Sum(IsNull(['+@Name+'],0)) As ['+@Name+']'
Set @SQL='Alter Table ##temp1 Add ['+@Name+'] int not Null default(0)'
Exec(@SQL)
Set @SQL='Update ##Temp1 Set ['+@Name+']=IsNull(Z.iCount,0) From (Select A.单位编码,Count(*) As iCount From 主表 A Inner Join 明细表 B On A.编号=B.编号 Where B.名称='''+@Name+''' Group By A.单位编码) Z Where ##Temp1.Part=Z.单位编码'
Exec(@SQL)
FETCH NEXT FROM abc INTO @Name
end
CLosE abc
DEALLOCATE abc
--不用建立游标,建立合计语句,上次的合计SQL语句比较复杂,这次的比较简单,因为你的合并特性比较明显,所以这次不需要这些,或者你的需求比较简单
Set @SQL='Insert Into ##Temp1(Part'+@SQLSel+') Select ''A001+A002'''+@SQLPart1+' From ##Temp1 Where Name In (''A001'',''A002'')'
Exec(@SQL)
--建立游标,合计A003
Set @SQL='Insert Into ##Temp1(Part) Values(''A003'')'
DECLARE abc CURSOR FOR select distinct B.名称 FROM 主表 A Inner Join 明细表 B On A.编号=B.编号 Where 单位编码='A003')
OPEN abc
FETCH NEXT FROM abc INTO @Name
WHILE (@@FETCH_STATUS = 0) begin
Set @SQL='Update ##Temp1 Set ['+@Name+'] From From (Select A.单位编码,Count(*) As iCount From 主表 A Inner Join 明细表 B On A.编号=B.编号 Where A.单位编码=''A003'' And B.名称='''+@Name+''' Group By A.单位编码) Z Where ##Temp1.Part=Z.单位编码'
FETCH NEXT FROM abc INTO @Name
end
CLosE abc
DEALLOCATE abc
--全部合计不需要游标
@SQL='Insert Into ##Temp1(Part'+@SQLSel+') Select ''合计'''+@SQLPart1+' From ##Temp1'
--统计最后结果
select * from ##temp1
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值