在线等:求助:存储过程实现统计分析,
表1(设备信息表):
DevNo Apart Devname DevModel price
1 车间1 机床 III型 3000
2 车间2 机床 II型 2000
3 木工车间 轴承 粗孔型 100
表2:(单位信息)
ID Apart
1 车间1
2 车间2
3 车间3
4 木工车间
5 。。。
表3 (设备名称表)
ID DevName
1 机床
2 车床
3 轴承
4 。。。
现在要实现这样的统计:
Apart DevName1(车床) DevName2(机床) DevName3(轴承)
车间1 车床数 机床数 轴承数
车间2 车床数 机床数 轴承数
车间3 车床数 机床数 轴承数
木工车间 车床数 机床数 轴承数
[解决办法]
表1...........t1
表2...........t2
select t2.Apart, sum(case when t1.DevName= '机床 ' then 1 else 0 end) as 'DevName1(车床) ',
sum(case when t1.DevName= '车床 ' then 1 else 0 end)as 'DevName2(车床) ',
sum(case when t1.DevName= '轴承 ' then 1 else 0 end)as 'DevName3(车床) '
from t1 right join t2 on t1.Apart=t2.Apart
group by t2.Apart
[解决办法]
DECLARE @SQL VARCHAR(8000)
SET @SQL= 'SELECT Apart '
SELECT @SQL= @SQL+ ',sum(CASE WHEN Devname = ' ' ' + Devname + ' ' ' THEN 1 ELSE 0 END) [ '+Devname+ '] ' FROM (SELECT DISTINCT Devname FROM A) TAB
SET @SQL=@SQL+ ' FROM A GROUP BY Apart '
EXEC (@SQL)
[解决办法]
变量是不能定义为text类型的
[解决办法]
一般没有用你那种格式查询出来的
t1(设备信息表)
1车间1机床III型3000
2车间2机床II型2000
3木工车间轴承粗孔型100
------------------------------------------
select Apart,DevName,count(DevNo) as 设备数 from t1 group by Apart,DevName
结果:
车间1机床1
车间2机床1
木工车间轴承1
[解决办法]
SELECT @SQL= @SQL+ ',sum(CASE WHEN Devname = ' ' ' + Devname + ' ' ' THEN 1 ELSE 0 END) [ '+Devname+ '] ' FROM (SELECT DISTINCT Devname FROM A) TAB
可以理解为用SQL中的FOR循环得到语句
[解决办法]
Declare @S1 varchar(800),@S2 varchar(8000)
Select @S1= ' ',@S2= ' '
Select @S1=@S1+ ',[ ' + Devname + ']=Sum(Case When Devname= ' ' ' + Devname + ' ' ' Then 1 Else 0 END) ' From 设备名称表
Select @S2= 'SELECT Apart ' + @S1 + ' FROM 设备信息表 GROUP BY Apart '
EXEC(@S2)
--如果设备名称表中的设置并不是完全存在于设备信息表中的,则可以将此语句修改为:
Select @S1=@S1+ ',[ ' + Devname + ']=Sum(Case When Devname= ' ' ' + Devname + ' ' ' Then 1 Else 0 END) ' From (SELECT DISTINCT Devname FROM 设备信息表) TAB
[解决办法]
使用第一种方法,可能会出现统计数量全部是0的现象;
当然如果设备名称表中的设备已经全部存在于设备信息表中的话,使用第一种方法会更高效一些