主题:[讨论]SQL語句
GEORGECHIN
[专家分:440] 发布于 2010-01-27 12:04:00
最近論壇上關於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个回复)
沙发
So_Show [专家分:470] 发布于 2010-01-27 13:36:00
先用行转列,
具体可以参考
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.損失項目
板凳
GEORGECHIN [专家分:440] 发布于 2010-01-27 14:00:00
恕愚鈍,沒有完全看懂,但似乎左連接錯誤了.我是要取所有B表中的數據,而非所有A表中的數據.
PS:SQL語句中的GROUP BY子句我就是暈暈的.不知能否詳細點解一下.
謝謝!
3 楼
So_Show [专家分:470] 发布于 2010-01-27 16:38:00
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 楼
GEORGECHIN [专家分:440] 发布于 2010-01-27 19:13:00
感謝樓上朋友的幫助.勉強看懂了,但還是有以下的問題請教.
單單這一句 select IDNO,'機故' as 損失項目,機故 as 損失數據 from 表A
的意思是:用"機故"作為值填入損失項目,用機故的值填入損失數據是嗎?也就是說,這一句就完成了創建一個有:IDNO,損失項目及損失數據三個字段的表?
5 楼
So_Show [专家分:470] 发布于 2010-01-27 20:05:00
恩,你的理解应该是正确的...
6 楼
GEORGECHIN [专家分:440] 发布于 2010-01-27 20:10:00
你讓我有一種豁然開朗的感覺,我用您給的方法調試一下,因為我實際中的句子比這個要復雜得多.(因為這是個損失確認的句子,還會涉及到審或未審的東東)如果搞不定,還找你幫忙.
謝謝!
7 楼
GEORGECHIN [专家分:440] 发布于 2010-01-28 11:43:00
再次感謝您的幫助,這個長達1500個字符的SQL終於搞定了.就單單此段代碼的目的而言,其代碼的長度好象比我用循環語句還要長一些.但是難得的是讓我知道如何用SQL創建字段及如何進行列行轉換.
我来回复