CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

求SQL语句: 类似行列互换.

楼主hn123(苗濤[www.vicmiao.com])2006-06-03 18:29:54 在 MS-SQL Server / 基础类 提问

把表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

相关问题

关键词

得分解答快速导航

  • 帖主:hn123
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo