【求助】求一条动态交差报表SQL语句

灵雨飘零 2015-11-11 03:18:23
求一条动态交差报表SQL语句。

需求是这样的,有三个表:设备信息表、设备类型表、部门表
设备信息表字段:EQUIP_ID,EQUIP_NAME、EQUIP_TYPE_ID、EQUIP_DEPART_ID;
设备类型表:TYPE_ID、TYPE_NAME;
部门表:DEPART_ID、DEPART_NAME;

要实现这样一个交差查询报表:



求SQL语句怎么写。
...全文
262 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yole 2015-11-12
  • 打赏
  • 举报
回复

CREATE TABLE #T_A(  
    EQUIP_DEPART_ID int  
    , EQUIP_NAME varchar(200)  
      
)   
INSERT INTO #T_A  
SELECT 1,N'设备A' 
UNION  all
SELECT 2,N'设备B'  
UNION  all
SELECT 2,N'设备C' 
UNION  all
SELECT 2,N'设备D' 
UNION  all
SELECT 1,N'设备D' 
UNION  all
SELECT 1,N'设备D'
UNION  all
SELECT 1,N'设备D' 
UNION  all
SELECT 3,N'设备A'
UNION  all
SELECT 3,N'设备A'
UNION  all
SELECT 4,N'设备C' 
UNION  all
SELECT 4,N'设备D' 
UNION  all
SELECT 4,N'设备A'
    
--select * from #T_A   
declare @sql varchar(max)  
set @sql=''  
select @sql=@sql + ',['+rtrim(EQUIP_NAME)+']=sum(case EQUIP_NAME when '''+rtrim(EQUIP_NAME)+''' then 1 else 0 end)'  
from #T_A group by EQUIP_NAME  
   
exec('select EQUIP_DEPART_ID'+@sql+'from  #T_A group by EQUIP_DEPART_ID' )  
DROP TABLE #T_A

/*
(12 行受影响)
EQUIP_DEPART_ID 设备A         设备B         设备C         设备D
--------------- ----------- ----------- ----------- -----------
1               1           0           0           3
2               0           1           1           1
3               2           0           0           0
4               1           0           1           1

(4 行受影响)
*/



测试数据弄错了~您试试这个。
Yole 2015-11-11
  • 打赏
  • 举报
回复
部门和设备名自己左联接连一下喽~~
Yole 2015-11-11
  • 打赏
  • 举报
回复

CREATE TABLE #T_A(  
    EQUIP_DEPART_ID int  
    , EQUIP_NAME varchar(200)  
     
)   
INSERT INTO #T_A  
SELECT 1,N'设备A' 
UNION  
SELECT 2,N'设备B'  
UNION  
SELECT 2,N'设备C' 
UNION  
SELECT 2,N'设备D' 
UNION  
SELECT 1,N'设备D' 
UNION  
SELECT 1,N'设备D'
UNION  
SELECT 1,N'设备D' 
UNION  
SELECT 3,N'设备A'
UNION  
SELECT 3,N'设备A'
UNION  
SELECT 4,N'设备C' 
UNION  
SELECT 4,N'设备D' 
UNION  
SELECT 4,N'设备A'
   
--select * from #T_A   
declare @sql varchar(max)  
set @sql=''  
select @sql=@sql + ',['+rtrim(EQUIP_NAME)+']=sum(case EQUIP_NAME when '''+rtrim(EQUIP_NAME)+''' then 1 else 0 end)'  
from #T_A group by EQUIP_NAME  
  
exec('select EQUIP_DEPART_ID'+@sql+'from  #T_A group by EQUIP_DEPART_ID' )  
DROP TABLE #T_A 

/*

(9 行受影响)
EQUIP_DEPART_ID 设备A         设备B         设备C         设备D
--------------- ----------- ----------- ----------- -----------
1               1           0           0           1
2               0           1           1           1
3               1           0           0           0
4               1           0           1           1

(4 行受影响)

*/
灵雨飘零 2015-11-11
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
如果某个类型的设备,所有部门都没有,要不要显示出来?
要把所有的类型和部门都列出来。没有数量就是0.
卖水果的net 2015-11-11
  • 打赏
  • 举报
回复
如果某个类型的设备,所有部门都没有,要不要显示出来?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧