求SQL语句: 类似行列互换.
把表TAB1内容更新到TAB2
F1 F2 ...F31 代表一个月中的每一天。
比如这个表中的数据是2006年01月数据
TAB1:
ID F1 F2 F2 F3 ..... F31
001 NULL 10 NULL 15 ..... NULL
TAB2:
ID DATE VAL
001 2006-01-01
001 2006-01-02 10
。。。。。。。。。。。
001 2006-01-31
注:当TAB1中 F1,F2....F31为NULL时,不更新TAB2中的VAL
问题点数:100、回复次数:6Top
1 楼sxycgxj(云中客)回复于 2006-06-03 18:36:54 得分 0
http://community.csdn.net/Expert/topic/4318/4318049.xml?temp=.7960474
这里有个例子,参考一下Top
2 楼laoliu666(鹅鹅鹅,曲项向天歌,白毛浮绿水,红掌拨清波。)回复于 2006-06-03 18:52:52 得分 0
既然有例子,我就不写了。LZ自己看看。Top
3 楼hn123(苗濤[www.vicmiao.com])回复于 2006-06-03 19:49:22 得分 0
我比较菜,如果大虾明示。Top
4 楼zjcxc(邹建)回复于 2006-06-03 20:26:22 得分 100
-- 处理示例
-- 示例数据
CREATE TABLE TAB1(ID varchar(10),
F1 int, F2 int, F3 int, F4 int,
--......... 其他字段
F31 int)
INSERT TAB1 SELECT '001',
NULL, 10, NULL, 15,
--..........其他列的值
NULL
CREATE TABLE TAB2(ID varchar(10), DATE datetime, VAL int)
INSERT TAB2 SELECT '001', '2006-01-01', NULL
UNION ALL SELECT '001', '2006-01-02', 10
UNION ALL SELECT '001', '2006-01-03', 10
UNION ALL SELECT '001', '2006-01-04', 10
--..........其他日期
UNION ALL SELECT '001', '2006-01-31', NULL
GO
--更新处理
UPDATE B
SET VAL = A.VAL
FROM TAB2 B
INNER JOIN(
SELECT
ID,
DATE=DATEADD(Day, CAST(STUFF(DATE, 1, 1, '') as int), '2005-12-31'),
VAL
FROM TAB1
UNPIVOT(
VAL FOR DATE IN(F1, F2, F3, F4,
-- ..... 其他字段
F31)
)UP
)A
ON A.DATE = B.DATE
-- 显示结果
SELECT * FROM TAB2
GO
DROP TABLE TAB1, TAB2
Top
5 楼zjcxc(邹建)回复于 2006-06-03 20:27:00 得分 0
-- 测试结果
ID DATE VAL
---------- ----------------------- -----------
001 2006-01-01 00:00:00.000 NULL
001 2006-01-02 00:00:00.000 10
001 2006-01-03 00:00:00.000 10
001 2006-01-04 00:00:00.000 15
001 2006-01-31 00:00:00.000 NULL
(5 行受影响)
Top
6 楼zjcxc(邹建)回复于 2006-06-03 20:31:04 得分 0
-- 上面是sql 2005支持的
-- 下面是 SQL 2000
-- 示例数据
CREATE TABLE TAB1(ID varchar(10),
F1 int, F2 int, F3 int, F4 int,
--......... 其他字段
F31 int)
INSERT TAB1 SELECT '001',
NULL, 10, NULL, 15,
--..........其他列的值
NULL
CREATE TABLE TAB2(ID varchar(10), DATE datetime, VAL int)
INSERT TAB2 SELECT '001', '2006-01-01', NULL
UNION ALL SELECT '001', '2006-01-02', 10
UNION ALL SELECT '001', '2006-01-03', 10
UNION ALL SELECT '001', '2006-01-04', 10
--..........其他日期
UNION ALL SELECT '001', '2006-01-31', NULL
GO
--更新处理
UPDATE B
SET VAL = A.VAL
FROM TAB2 B
INNER JOIN(
SELECT ID, VAL = F1,
DATE = DATEADD(Day, CAST(STUFF(F1, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F1 IS NOT NULL
UNION ALL
SELECT ID, VAL = F2,
DATE = DATEADD(Day, CAST(STUFF(F2, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F2 IS NOT NULL
UNION ALL
SELECT ID, VAL = F3,
DATE = DATEADD(Day, CAST(STUFF(F3, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F3 IS NOT NULL
UNION ALL
SELECT ID, VAL = F4,
DATE = DATEADD(Day, CAST(STUFF(F4, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F4 IS NOT NULL
--..........其他字段
UNION ALL
SELECT ID, VAL = F31,
DATE = DATEADD(Day, CAST(STUFF(F31, 1, 1, '') as int), '2005-12-31')
FROM TAB1 WHERE F31 IS NOT NULL
)A
ON A.DATE = B.DATE
-- 显示结果
SELECT * FROM TAB2
GO
DROP TABLE TAB1, TAB2
Top




