您的位置:首页 > 数据库

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

2006-12-12 03:17 1256 查看
我有两个表,一个是主表如下所示
编号 类型 单位编码
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
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息