数据库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
编号 类型 单位编码
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
相关文章推荐
- 数据库系列之T-SQL(存储过程实现分页查询)
- LINQ to SQL 查询数据库和使用存储过程
- SQL中利用sql语句查询数据库中的所有表、存储过程
- 用游标实现查询当前服务器所有数据库所有表的SQL
- 关于linq to sql调用存储过程,出现"无法枚举查询结果多次"的问题
- SQL实现分组统计查询(按月、小时分组)
- 关于linq to sql调用存储过程,出现"无法枚举查询结果多次"的问题
- 问题:mybatis查询无结果集,但数据库执行相同的sql有结果集
- s2sh向数据库插入数据,控制台有打印sql语句,数据库查询不到数据问题
- LINQ to SQL 查询数据库和使用存储过程
- 在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)
- 关于统计的一个sql问题,使用动态sql语句实现。
- erlang mnesia 数据库实现SQL查询
- 一条SQL语句查询数据库中的所有表、存储过程、触发器 (sysobjects表信息)
- SQL语句实现查询一段时间内的数据中要注意的细节问题
- Solr高效利用:Solr实现SQL的查询与统计
- LINQ to SQL 查询数据库和使用存储过程
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第四部分 查询结果集中间n行数据)
- 查询分类并实现分类统计SQL存储过程
- Sql server 数据库中,纯SQL语句查询、执行 单引号问题。