我有两个表,一个是主表如下所示
编号 类型 单位编码
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