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

列名在一个表中存储
我有一个表,结构如下:
    表名   TABLE1
    列名:   ACS1           ACS2           ACS3......ACS20
        数据       X1           X2                 X3       ....   AE

    表2     TABLE2
      列名     ACS1     FEL1       FEL2
      其中   “ACS1”的值与TABLE1中“ACS1 "的值一样,但是,FEL1,FEL2中存在是表TABLE1中列的名字。
        举例:   ACS1     FEL1       FEL2
                          X1       ACS4         ACS10
                          X2       ACS4         ACS1
                          X3       ACS5         ACS22
    我需要的是根据TABLE2中指定的字段,得到该字段对应的值。
结果如下:
                          ACS1     FEL1       FEL2         ACS4     ACS10
                          X1       ACS4         ACS10       X4           X10
                          X2       ACS4         ACS1         X4           X10
                          X3       ACS5         ACS22       X5           X22
如何做?


------解决方案--------------------
SQL code



CREATE TABLE TABLE1
(
QU1 VARCHAR(100),
STDT VARCHAR(100),
SUDT VARCHAR(100),
SFDT VARCHAR(100),
UFDT  VARCHAR(100)
)

CREATE TABLE TABLE2
(
QU1 VARCHAR(100),
FEL1 VARCHAR(100),
FEL2 VARCHAR(100)
)

GO

INSERT INTO TABLE1
SELECT '3-SA','20120101','20120504','20120708','20120910'
UNION ALL
SELECT '1-HA','20121010','20120401','20120727','20120501'
UNION ALL
SELECT '2-TD','20121001','20120602','20121231','20120512'  
UNION ALL
SELECT '3-HA','20121101','20120805','20120110','20120807'  

INSERT INTO TABLE2
SELECT '3-SA','SUDT','UFDT'
UNION ALL
SELECT '1-HA','STDT','SUDT'
UNION ALL
SELECT '2-TD','SUDT','SFDT'
UNION ALL
SELECT '3-HA','SFDT','STDT'

SELECT * FROM TABLE1
SELECT * FROM TABLE2

GO

CREATE TABLE #TAB(P1 VARCHAR(100),P2 VARCHAR(100),P3 VARCHAR(100),P4 VARCHAR(100),P5 VARCHAR(100))

DECLARE @SQL VARCHAR(8000),@P1 VARCHAR(100),@P2 VARCHAR(100),@P3 VARCHAR(100)
EXEC (@SQL)
DECLARE CUR_SOR CURSOR FOR 
SELECT * FROM TABLE2
OPEN CUR_SOR
FETCH NEXT FROM CUR_SOR INTO @P1,@P2,@P3
WHILE @@FETCH_STATUS=0
BEGIN
    
    SET @SQL = 'INSERT INTO #TAB ' +
     ' SELECT '''+@P1+''' ,''' + @P2 + ''',''' + @P3+''','+
     @P2+',' + @P3 +' FROM TABLE1 WHERE QU1='''+@P1+''' '
     EXEC (@SQL)
    FETCH NEXT FROM CUR_SOR INTO @P1,@P2,@P3
END

CLOSE CUR_SOR
DEALLOCATE CUR_SOR

SELECT * FROM #TAB
DROP TABLE #TAB

GO

DROP TABLE TABLE1
DROP TABLE TABLE2