一个特殊的行列转换问题

问题来自CSDN,http://community.csdn.net/Expert/topic/5335/5335373.xml?temp=.9038813:

表A
F_type F_Price1 F_price2
普通 10 5
金卡 9 4
银卡 8 3

表B
F_bookname F_bookNum1 F_bookNum2
AAA 1 0
BBB 2 3
CCC 3 5

表C
F_Code F_Spec
001 螺丝
002 钉子

要求按表A中F_price1和F_price2中的值动态生成列
并把同样价格的放在与价格对应的列中,结果如下:
(备注:几个表中没有字段关联,但是表C两条记录是不变的,表C中的记录001对应表B中的F_Booknum1,F_bookNum1与表AF_Price1,记录2也是一样的)
其实表A和表C的主要就是为了动态生成列,表B是销售表,统计下哪种价格卖了多少!请大家帮忙!

螺丝|10元 螺丝|9元 螺丝|8元 钉子|5元 钉子|4元 钉子|3元
1 2 3 0 3 5


下面是建表语句:
create table A(F_type varchar(10), F_Price1 int, F_price2 int)
insert A select '普通', 10, 5
union all select '金卡', 9, 4
union all select '银卡', 8, 3
create table B(F_bookname varchar(10), F_bookNum1 int, F_bookNum2 int)
insert B select 'AAA', 1, 0
union all select 'BBB', 2, 3
union all select 'CCC', 3, 5
create table C(F_code varchar(10), F_spec varchar(10))
insert C select '001','螺丝'
union all select '002','钉子'

看得比较晕,但仔细看一下要求,问题还是可以解决的,如:

create table A(F_type varchar(10), F_Price1 int, F_price2 int)
insert A select '普通', 10, 5
union all select '金卡', 9, 4
union all select '银卡', 8, 3
create table B(F_bookname varchar(10), F_bookNum1 int, F_bookNum2 int)
insert B select 'AAA', 1, 0
union all select 'BBB', 2, 3
union all select 'CCC', 3, 5
create table C(F_code varchar(10), F_spec varchar(10))
insert C select '001','螺丝'
union all select '002','钉子'

DECLARE @Sql nvarchar(4000)
SELECT IDENTITY(int,1,1) AS [ID],F_spec,CASE F_spec WHEN '螺丝' THEN F_Price1 ELSE F_Price2 END AS F_Price INTO #T1 FROM C LEFT OUTER JOIN A ON 1=1
SELECT IDENTITY(int,1,1) AS [ID],F_spec,CASE F_spec WHEN '螺丝' THEN F_Booknum1 ELSE F_Booknum2 END AS F_Booknum INTO #T2 FROM C LEFT OUTER JOIN B ON 1=1
SET @Sql='SELECT '
SELECT @Sql=@Sql+CAST(B.F_Booknum AS nvarchar(20))+ ' AS '''+A.F_spec+'|'+CAST(A.F_Price AS nvarchar(20))+'元'','

FROM #T1 AS A INNER JOIN #T2 AS B ON A.[ID]=B.[ID]
SET @Sql=LEFT(@Sql,LEN(@Sql)-1)
EXECUTE( @Sql)
DROP TABLE A,B,C,#T1,#T2

/*
螺丝|10元 螺丝|9元 螺丝|8元 钉子|5元 钉子|4元 钉子|3元
1 2 3 0 3 5
*/

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7764484/viewspace-897059/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7764484/viewspace-897059/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值