日期:2014-05-18  浏览次数:20516 次

这句动态语句应该怎么写?(小F救救我)
tableA

Id State Type1 Type2 Type3
1 3 2 4 8
2 1 1 3 5
3 3 1 3 5
4 2 1 3 6
5 1 2 4 8
6 1 2 4 8
7 2 2 4 8


tbState
Id StateName
1 StateA
2 StateB
3 StateC



tbType
Id TypeName ParentId TypeCorresponding
1 TypeA 0 TypeH1
2 TypeB 0 TypeH1
3 TypeAA 1 TypeH2
4 TypeBA 2 TypeH2
5 TypeAAA 3 TypeH3
6 TypeAAB 3 TypeH3
7 TypeBAA 4 TypeH3
8 TypeBAB 4 TypeH3

tbType现在显示的内容相当于3个联动的下拉框,当下拉框选择TypeA时,显示1个选项TypeAA,选择TypeB时,显示1个选项TypeBA,然后当下拉框选择TypeAA时,显示2个选项TypeAAA,TypeAAB,当下拉框选择TypeBA时,显示2个选项TypeBAA,TypeBAB
字段TypeCorresponding显示的内容有2层含义:
1.表示数据的归类  
2.TypeH1对应tableA的Type1,也就是说tableA的Type1字段的数据只能显示1和2,
  TypeH2对应tableA的Type2,也就是说tableA的Type2字段的数据只能显示3和4
  TypeH3对应tableA的Type3,也就是说tableA的Type3字段的数据只能显示5,6,7,8


我想运用动态sql语句显示出这样一个效果:

当在页面上选择tbType的TypeA时,显示

类型 StateA StateB StateC  
TypeAA 1 1 1



当在页面上选择tbType的TypeB时,显示

类型 StateA StateB StateC  
TypeBA 2 1 1


当在页面上选择tbType的TypeAA时,显示

类型 StateA StateB StateC  
TypeAAA 1 0 1
TypeAAB 0 1 0


以此类推,

补充:TypeAAA和TypeAA只是举个例子,真实的parent级别的TypeName不是只差一位的关系



假如我想显示当在页面上选择tbType的TypeAA时,显示

类型 StateA StateB StateC  
TypeAAA 1 0 1
TypeAAB 0 1 0


那么这句动态sql语句应该怎么写?

------解决方案--------------------
下面代码给你参考吧, 记得下回把Create Table和Insert 先写好再发问题
SQL code

/*
create table tableA(id int, state int, type1 int, type2 int, type3 int)
create table tbState(id int, StateName varchar(100))
create table tbType(id int, TypeName varchar(100), parentId int, TypeCorresponding varchar(100))
*/
GO
/*
insert into tableA values(1, 3, 2, 4, 8)
insert into tableA values(2, 1, 1, 3, 5)
insert into tableA values(3, 3, 1, 3, 5)
insert into tableA values(4, 2, 1, 3, 6)
insert into tableA values(5, 1, 2, 4, 8)
insert into tableA values(6, 1, 2, 4, 8)
insert into tableA values(7, 2, 2, 4, 8)

insert into tbState values(1, 'StateA')
insert into tbState values(2, 'StateB')
insert into tbState values(3, 'StateC')

insert into tbType values(1, 'TypeA', 0, 'TypeH1')
insert into tbType values(2, 'TypeB', 0, 'TypeH1')
insert into tbType values(3, 'TypeAA', 1, 'TypeH2')
insert into tbType values(4, 'TypeBA', 2, 'TypeH2')
insert into tbType values(5, 'TypeAAA', 3, 'TypeH3')
insert into tbType values(6, 'TypeAAB', 3, 'TypeH3')
insert into tbType values(7, 'TypeBAA', 4, 'TypeH3')
insert into tbType values(8, 'TypeBAB', 4, 'TypeH3')

*/

--传入参数@p, 值取 tyType.id, 例如想传入TypeA, 则@p = 1
declare @p int
set @p = 1

declare @s varchar(4000), @s1 varchar(4000)
set @s = ''

set @s1 = 'select ts.StateName, tt.typeName, Count(ta.id) cnt
into #a
from tbState ts 
    full join (select * from tbType tt where tt.ParentId = ' + cast(@p as varchar) + ') tt on 1=1
    left join tableA ta on ta.state = ts.id 
        and (ta.Type1 = tt.id or ta.Type2 = tt.id or ta.Type3 = tt.id)
group by ts.StateName, tt.TypeName
'

select @s = @s + 'Sum(case when StateName = ' + char(39) + StateName + char(39) + ' then cnt else 0 end) ' + StateName + ','
from tbState
if len(@s) <> 0 set @s = left(@s, len(@s) - 1)

Set @s = @s1 + '
' + 'select typeName, ' + @s + ' from #a group by typeName order by typeName'

print @s
exec(@s)

------解决方案--------------------
数据库是2000的话,那就用函数代替
SQL code

CREATE FUNCTION f_Cid(@TypeName VARCHAR(50)) 
RETURNS @t TABLE(ID INT,Level int) 
AS 
BEGIN 
    DECLARE @ID INT
    DECLARE @Level int 
    SET @Level=1 
    INSERT @t SELECT Id,@Level  FROM tbType WHERE tbType.TypeName=@TypeName
    WHILE @@ROWCOUNT>0 
    BEGIN 
        SET @Level=@Level+1 
        INSERT @t SELECT a.Id,@Level