求一条SQL语句,比较复杂
table1:
序号 类别
01 玩具
02 食物
table2:
序号 类别 名称 对应编号
01 玩具 大小 A1
02 玩具 面积 A2
03 玩具 体积 A3
04 食物 重量 A7
05 食物 颜色 A9
table3:
序号 物品 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 .....
01 皮球 10 20 30
02 篮球 20 30 40
03 苹果 20 50
04 香蕉 80 70
显示效果
对应2种类别
当是玩具类别时候显示
物品 类别 大小 面积 体积
皮球 玩具 10 20 30
篮球 玩具 20 30 40
当是食物类别时候显示
物品 类别 重量 颜色
苹果 食物 20 50
香蕉 食物 80 70
请给出具体的查询过程。。谢谢
[解决办法]
create table A(序号 nvarchar(10),类别 nvarchar(10))
insert A select '01 ', '玩具 '
union all select '02 ', '食物 '
create table B(序号 nvarchar(10), 类别 nvarchar(10), 名称 nvarchar(10), 对应编号 nvarchar(10))
insert B select '01 ', '玩具 ', '大小 ', 'A1 '
union all select '02 ', '玩具 ', '面积 ', 'A2 '
union all select '03 ', '玩具 ', '体积 ', 'A3 '
union all select '04 ', '食物 ', '重量 ', 'A7 '
union all select '05 ', '食物 ', '颜色 ', 'A9 '
create table C(序号 nvarchar(10), 物品 nvarchar(10), A1 int, A2 int, A3 int, A4 int, A5 int, A6 int, A7 int, A8 int, A9 int, A10 int)
insert C(序号, 物品, A1, A2, A3) values( '01 ', '皮球 ',10,20,30)
insert C(序号, 物品, A1, A2, A3) values( '02 ', '篮球 ',20,30,40)
insert C(序号, 物品, A7, A9) values( '03 ', '苹果 ',20,50)
insert C(序号, 物品, A7, A9) values( '04 ', '香蕉 ',80,70)
declare @sql nvarchar(4000)
set @sql= 'select 物品, ' '玩具 ' ' as 类别, '
select @sql=@sql+对应编号+ ' as '+名称+ ', '
from B where 类别= '玩具 '
set @sql=left(@sql, len(@sql)-1)
set @sql=@sql+ ' from C '
print @sql
select 物品, '玩具 ' as 类别,A1 as 大小,A2 as 面积,A3 as 体积 from C
[解决办法]
table1:
序号 类别
01 玩具
02 食物
table2:
名称 对应编号
大小 A1
面积 A2
体积 A3
重量 A7
颜色 A9
table3:
序号 物品 类别
01 皮球 01
02 篮球 01
table4:
物品序号 属性 属性值
01 A1 10
01 A2 20
01 A3 30
02 A1 20
02 A1 30
[解决办法]
不是很难,难点就是怎么样构造SQL语句而已,楼主可以参考以下方法(这里借用lzhcxc(天道酬勤)兄弟的插入语句):
create table A(序号 nvarchar(10),类别 nvarchar(10))
insert A select '01 ', '玩具 '
union all select '02 ', '食物 '
create table B(序号 nvarchar(10), 类别 nvarchar(10), 名称 nvarchar(10), 对应编号 nvarchar(10))
insert B select '01 ', '玩具 ', '大小 ', 'A1 '
union all select '02 ', '玩具 ', '面积 ', 'A2 '
union all select '03 ', '玩具 ', '体积 ', 'A3 '
union all select '04 ', '食物 ', '重量 ', 'A7 '
union all select '05 ', '食物 ', '颜色 ', 'A9 '
create table C(序号 nvarchar(10), 物品 nvarchar(10), A1 int, A2 int, A3 int, A4 int, A5 int, A6 int, A7 int, A8 int, A9 int, A10 int)
insert C(序号, 物品, A1, A2, A3) values( '01 ', '皮球 ',10,20,30)
insert C(序号, 物品, A1, A2, A3) values( '02 ', '篮球 ',20,30,40)
insert C(序号, 物品, A7, A9) values( '03 ', '苹果 ',20,50)
insert C(序号, 物品, A7, A9) values( '04 ', '香蕉 ',80,70)
DECLARE @Input nvarchar(10) --要统计的类别,可以根据实际需要输入
DECLARE @EXECUTE_SQL nvarchar(4000)
DECLARE @EXECUTE_WHERE nvarchar(4000)
SELECT @Input= '食物 ',@EXECUTE_SQL= 'SELECT [物品], ' ' '+@Input + ' ' ' AS [类别] ',@EXECUTE_WHERE= ' WHERE 1=1 '
SELECT @EXECUTE_SQL=@EXECUTE_SQL+ ',SUM( '+[对应编号]+ ') AS [ '+[名称]+ '] '
,@EXECUTE_WHERE=@EXECUTE_WHERE+ ' AND '+[对应编号]+ ' IS NOT NULL '
FROM B WHERE B.[类别]=@Input
SET @EXECUTE_SQL=@EXECUTE_SQL+ ' FROM C '+@EXECUTE_WHERE+ ' GROUP BY [物品] '
EXECUTE( @EXECUTE_SQL)
DROP TABLE A,B,C
/*
物品 类别 大小 面积 体积
皮球 玩具 10 20 30
篮球 玩具 20 30 40
当是食物类别时候显示
物品 类别 重量 颜色
苹果 食物 20 50
香蕉 食物 80 70
*/