create table wareHourse(id int,wareID varchar(10),wareName varchar(10))
insert into wareHourse values(1, '01',                 'A')                   
insert into wareHourse values(2, '02',                 'B')                   
insert into wareHourse values(3, '03',                 'C')   
insert into wareHourse values(4, '04',                 'D') 
create table Inventory(id int,InvID varchar(10),InvName varchar(10))
insert into Inventory values(1, '001',                 'aa')                   
insert into Inventory values(2, '002',                 'bb')                   
insert into Inventory values(3, '003',                 'cc')   
insert into Inventory values(4, '004',                 'dd') 
create table 仓库分布表(id int,InvID varchar(10),wareID varchar(10))
insert into 仓库分布表 values(1, '001',               '01')                 
insert into 仓库分布表 values(2, '001',               '02')                 
insert into 仓库分布表 values(3, '002',               '03')                 
insert into 仓库分布表 values(4, '003',               '04')                 
insert into 仓库分布表 values(5, '004',               '01')                 
insert into 仓库分布表 values(6, '003',               '02')                 
insert into 仓库分布表 values(7, '002',               '03')                 
insert into 仓库分布表 values(8, '001',               '04')                 
insert into 仓库分布表 values(9, '001',               '03')    
go--静态SQL
select invname,
  sum(case warename when 'A' then 1 else 0 end) 'A',
  sum(case warename when 'B' then 1 else 0 end) 'B',
  sum(case warename when 'C' then 1 else 0 end) 'C',
  sum(case warename when 'D' then 1 else 0 end) 'D'
from
(
  select b.invname,a.warename,c.id from wareHourse a,Inventory b,仓库分布表 c where b.invid = c.invid and a.wareid = c.wareid
) t
group by invnamedrop table wareHourse,Inventory, 仓库分布表/*
invname    A           B           C           D           
---------- ----------- ----------- ----------- ----------- 
aa         1           1           1           1
bb         0           0           2           0
cc         0           1           0           1
dd         1           0           0           0(所影响的行数为 4 行)
*/

解决方案 »

  1.   

    create table wareHourse(id int,wareID varchar(10),wareName varchar(10))
    insert into wareHourse values(1, '01',                 'A')                   
    insert into wareHourse values(2, '02',                 'B')                   
    insert into wareHourse values(3, '03',                 'C')   
    insert into wareHourse values(4, '04',                 'D') 
    create table Inventory(id int,InvID varchar(10),InvName varchar(10))
    insert into Inventory values(1, '001',                 'aa')                   
    insert into Inventory values(2, '002',                 'bb')                   
    insert into Inventory values(3, '003',                 'cc')   
    insert into Inventory values(4, '004',                 'dd') 
    create table 仓库分布表(id int,InvID varchar(10),wareID varchar(10))
    insert into 仓库分布表 values(1, '001',               '01')                 
    insert into 仓库分布表 values(2, '001',               '02')                 
    insert into 仓库分布表 values(3, '002',               '03')                 
    insert into 仓库分布表 values(4, '003',               '04')                 
    insert into 仓库分布表 values(5, '004',               '01')                 
    insert into 仓库分布表 values(6, '003',               '02')                 
    insert into 仓库分布表 values(7, '002',               '03')                 
    insert into 仓库分布表 values(8, '001',               '04')                 
    insert into 仓库分布表 values(9, '001',               '03')    
    go--静态SQL
    select invname,
      sum(case warename when 'A' then 1 else 0 end) 'A',
      sum(case warename when 'B' then 1 else 0 end) 'B',
      sum(case warename when 'C' then 1 else 0 end) 'C',
      sum(case warename when 'D' then 1 else 0 end) 'D'
    from
    (
      select b.invname,a.warename,c.id from wareHourse a,Inventory b,仓库分布表 c where b.invid = c.invid and a.wareid = c.wareid
    ) t
    group by invname--动态SQL
    declare @sql varchar(8000)
    set @sql = 'select invname'
    select @sql = @sql + ' , sum(case warename when ''' + warename + ''' then 1 else 0 end) [' + warename + ']'
    from (select distinct warename from (select b.invname,a.warename,c.id from wareHourse a,Inventory b,仓库分布表 c where b.invid = c.invid and a.wareid = c.wareid)t) as a
    set @sql = @sql + ' from (select b.invname,a.warename,c.id from wareHourse a,Inventory b,仓库分布表 c where b.invid = c.invid and a.wareid = c.wareid) t group by invname'
    exec(@sql) drop table wareHourse,Inventory, 仓库分布表/*
    invname    A           B           C           D           
    ---------- ----------- ----------- ----------- ----------- 
    aa         1           1           1           1
    bb         0           0           2           0
    cc         0           1           0           1
    dd         1           0           0           0(所影响的行数为 4 行)
    */