回 帖 发 新 帖 刷新版面

主题:[讨论]SQL語句

最近論壇上關於SQL的真是很多,我也發一條來請教大家.

 兩個表,A,B
 表A字段:
 IDNO       機故       待線      其它
 123456      0         10        15
 654321      10        0         20
 
 表B字段
 IDNO      損失項目      
 123456     機故
 654321     其它
 
 現在要得到一個新表,其中包括IDNO,損失項目及增加一個新的字段"損失數據",其要的結果如下:

 IDNO         損失項目         損失數據
 123456       機故             0
 654321       其它             20

 PS:只要按表B進行左連接就可以了.

回复列表 (共7个回复)

沙发

先用行转列,
具体可以参考
http://topic.csdn.net/u/20100109/13/6A10C168-F190-4766-B838-ADBF03C4AC7B.html

如果懒点,直接点的话,VFP里注意段落加分号... 本人没测试过-。-..错的话,请见谅

select a.*,isnull(b.損失數據,0) as 損失數據 from 表B a 
   left join (select IDNO,'機故' as 損失項目,sum(機故) as 損失數據 from 表A group by IDNO
              union all
              select IDNO,'待線' as 損失項目,sum(待線) as 損失數據 from 表A group by IDNO
              union all
              select IDNO,'其它' as 損失項目,sum(其它) as 損失數據 from 表A group by IDNO
              ) b on a.IDNO=b.IDNO and a.損失項目=b.損失項目


         
           

板凳


  恕愚鈍,沒有完全看懂,但似乎左連接錯誤了.我是要取所有B表中的數據,而非所有A表中的數據.

  PS:SQL語句中的GROUP BY子句我就是暈暈的.不知能否詳細點解一下.

 謝謝!

3 楼

 1.当表A字段IDNO如你所写唯一时:
   IDNO       機故       待線      其它
   123456      0         10        15
   654321      10        0         20

可直接用 
按機故查各IDNO數據 select IDNO,'機故' as 損失項目,機故 as 損失數據 from 表A
按待線查各IDNO數據 select IDNO,'待線' as 損失項目,待線 as 損失數據 from 表A 
按其它查各IDNO數據 select IDNO,'其它' as 損失項目,其它 as 損失數據 from 表A 

把3条记录连接在一起 所以用union all把3条select 语句连一起
则上面将变成 
*---------------------------------------
   IDNO         損失項目         損失數據
   123456       機故             0
   654321       機故             10
   123456       待線             10
   654321       待線             0
   123456       其它             15
   654321       其它             20

考虑到可能表A IDNO不唯一时,所以我上面语句用了group by IDNO
去汇总了他,如果IDNO唯一 可以直接用上面那语句

之后就是用表B左连接上面那表,连接条件为IDNO与損失項目都相等,所以最后的表就为
假如损失项目有个XX 表A里根本没有,所以连接数据时用了isnull(b.損失數據,0) 
*---------------------------------------------
   IDNO         損失項目         損失數據
   123456       機故             0
   654321       其它             20
*----------------------------------------------

所以,当你表A IDNO唯一或不唯一的时候 用上面帖子那语句,都可以


而下面这语句是适用于表A IDNO唯一时
select a.*,isnull(b.損失數據,0) as 損失數據 from 表B a 
   left join (select IDNO,'機故' as 損失項目,機故 as 損失數據 from 表A
              union all
              select IDNO,'待線' as 損失項目,待線 as 損失數據 from 表A
              union all
              select IDNO,'其它' as 損失項目,其它 as 損失數據 from 表A
              ) b on a.IDNO=b.IDNO and a.損失項目=b.損失項目


4 楼

感謝樓上朋友的幫助.勉強看懂了,但還是有以下的問題請教.

  單單這一句  select IDNO,'機故' as 損失項目,機故 as 損失數據 from 表A

  的意思是:用"機故"作為值填入損失項目,用機故的值填入損失數據是嗎?也就是說,這一句就完成了創建一個有:IDNO,損失項目及損失數據三個字段的表?

5 楼

恩,你的理解应该是正确的...

6 楼


 你讓我有一種豁然開朗的感覺,我用您給的方法調試一下,因為我實際中的句子比這個要復雜得多.(因為這是個損失確認的句子,還會涉及到審或未審的東東)如果搞不定,還找你幫忙.

 謝謝!

7 楼

  再次感謝您的幫助,這個長達1500個字符的SQL終於搞定了.就單單此段代碼的目的而言,其代碼的長度好象比我用循環語句還要長一些.但是難得的是讓我知道如何用SQL創建字段及如何進行列行轉換.

我来回复

您尚未登录,请登录后再回复。点此登录或注册