全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3137
推到 Plurk!
推到 Facebook!

sql中union 如何併成一筆

答題得分者是:jackiemi2_seed
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-25 16:48:07 IP:61.67.xxx.xxx 未訂閱
select 'M5000' as DBFNAME, WORKER, sum(LISTFARE) as LISTM, sum(WORKFARE) as WORKM, sum(ACTMONEY) as ACTM, count(ACTMONEY) as FIXTIMES, 0.0 as P1, 0.0 as PARTTIME
from M5000
where ((FIXDATE>='970501') and (FIXDATE<='970510')) and (CONFIRM="Y") and FIXHEAD in ("900")
group by WORKER
union
select 'M5001' as DBFNAME, a.WORKER, 0.0 as LISTM, 0.0 as WORKM, 0.0 as ACTM, 0 as FIXTIMES, sum(b.P1) as P1, sum(b.PARTTIME) as PARTTIME
from M5000 a, M5001 b
where ((FIXDATE>='970501') and (FIXDATE<='970510')) and (CONFIRM="Y") and FIXHEAD in ("900")
and a.FIXHEAD=b.FIXHEAD and a.FIXBODY=b.FIXBODY
group by a.WORKER

這是我的一個sql語法, 得到的結果如圖


請問有沒有辦法把 M5001 中的林, 曹, 盛三人的 P1, PARTTIME 值移到 M5000 記錄之後相同的欄位, 使其變成三筆記錄, 而不是分成兩段,
註: M5000為 MASTER DBF, M5001為 DETAIL DBF, 資料庫格式為 FIREBIRD 1.5X
M5000與M5001之間是利用 FIXHEAD, FIXBODY 兩個欄位做關聯的, 或許有人會想到利用 WORKER 來做KEYFIELD 處理
但很可惜, M5000 有 WORKER 欄位, 但 M5001 沒有, 所以無法利用 WORKER 來操作

謝謝!
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-25 19:34:36 IP:220.134.xxx.xxx 訂閱
小弟之前也有類似的情形在用union
會讓資料分出來
之後改成Left join時就不會了
以下是小弟之後用的語法
不知是否和大大的類似情形
SELECT a.out_date, a.vender, b.pp
FROM
(SELECT out_date, vender FROM out_iMEI WHERE (out_date = '2008/5/10') and (vender = 'M003')) AS a
LEFT OUTER JOIN
(SELECT SUM(seq) AS pp, in_date, vender FROM in_iMEI GROUP BY in_date, vender) AS b
ON a.out_date = b.in_date AND a.vender = b.vender

不過不知大大是否還是要保留住M5000和M50001~這個2顯示
------
程式沒有這麼難
只是還沒打通其中要絕
編輯記錄
shunaaron 重新編輯於 2008-06-25 19:35:44, 註解 無‧
shunaaron 重新編輯於 2008-06-25 21:27:54, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-26 01:12:08 IP:61.67.xxx.xxx 未訂閱
情況有點不同
因為你的案例, a, b 是利用 out_date, vender做關聯, 而且 a, b 都有這個欄位
而我的是以 worker 為 group by 做sum值, 但 M5000(a)有 , 而 M5001(b)卻沒有

===================引 用 shunaaron 文 章===================
小弟之前也有類似的情形在用union
會讓資料分出來
之後改成Left join時就不會了
以下是小弟之後用的語法
不知是否和大大的類似情形
SELECT a.out_date, a.vender, b.pp
FROM
(SELECT out_date, vender FROM out_iMEI WHERE (out_date = '2008/5/10') and (vender = 'M003')) AS a
LEFT OUTER JOIN
(SELECT SUM(seq) AS pp, in_date, vender FROM in_iMEI GROUP BY in_date, vender) AS b
ON a.out_date = b.in_date AND a.vender = b.vender

不過不知大大是否還是要保留住M5000和M50001~這個2顯示
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-06-26 15:32:50 IP:61.218.xxx.xxx 訂閱
在union下面那一段的0.0 as LISTM改成sum(a.LISTFARE) as LISTM,
這樣只要一段sql就不用二段sql再用union合併了
這樣應該就可以了吧(在ms sql可以,FIREBIRD沒用過).....
------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-06-26 21:55:23 IP:61.67.xxx.xxx 未訂閱
不知道我有沒有誤解你的意思, 你是指這樣的做法嗎?

select 'M5001' as DBFNAME, a.WORKER, sum(a.LISTFARE) as LISTM, sum(a.WORKFARE) as WORKM, sum(a.ACTMONEY) as ACTM, count(*) as FIXTIMES, sum(b.P1) as P1, sum(b.PARTTIME) as PARTTIME
from M5000 a, M5001 b
where ((FIXDATE>='970501') and (FIXDATE<='970510')) and (CONFIRM="Y") and FIXHEAD in ("900")
and a.FIXHEAD=b.FIXHEAD and a.FIXBODY=b.FIXBODY
group by a.WORKER

那就錯誤, 乍看之下好像是通的, 但是我舉一個例子

M5000-->MASTER
M5001-->DETAIL
小王 , 900-10000 , ACTMONEY $10000 ==> M5000
900-10000, P1 $800, 30
900-10000, P1 $1600, 40
小明, 900-10001, ACTMONEY $9000 ==> M5000
900-10001, P1 $1000, 55
小張, 900-10003, ACTMONEY $500 ==> M5000
900-10003, P1 $100, 10
900-10003, P1 $200, 20
900-10003, P1 $100, 30

真正要得到答案的是
WORKER ACTMONE P1 PARTTYPE
小王 10000 2400 70
小明 9000 1000 55
小張 500 500 60

可是上面的語法得到的結果是
小王, 20000,2400,70
小明, 9000,1000,55
小張, 1500,500,60

看出差異了嗎?
編輯記錄
P.D. 重新編輯於 2008-06-26 21:56:44, 註解 無‧
P.D. 重新編輯於 2008-06-26 22:01:43, 註解 無‧
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-06-27 15:54:13 IP:61.218.xxx.xxx 訂閱
P.D.版主不好意思,上面那個sql,我知錯在那了...
試試下面的語法,應該可以了...
select WORKER,sum(LISTM),sum(WORKM),sum(P1),sum(PARTTIME) from
(select WORKER,FIXHEAD,FIXBODY,sum(LISTFARE) AS LISTM,sum(WORKFARE) AS WORKM from M5000
group by WORKER,FIXHEAD,FIXBODY) M5000_temp,
(select FIXHEAD,FIXBODY,sum(P1) AS P1,sum(PARTTIME) AS PARTTIME from M5001
group by FIXHEAD,FIXBODY) M5001_temp
where M5000_temp.FIXHEAD=M5001_temp.FIXHEAD
and M5000_temp.FIXBODY=M5001_temp.FIXBODY
group by M5000_temp.WORKER
------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-06-27 22:09:42 IP:61.67.xxx.xxx 未訂閱
這個方法我也曾試用過, 樓上也有類似的用法, 但我發現
firebird 並不支援
select ..... from
(select .... )
的用法
===================引 用 jackiemi2_seed 文 章===================
P.D.版主不好意思,上面那個sql,我知錯在那了...
試試下面的語法,應該可以了...
select WORKER,sum(LISTM),sum(WORKM),sum(P1),sum(PARTTIME) from
(select WORKER,FIXHEAD,FIXBODY,sum(LISTFARE) AS LISTM,sum(WORKFARE) AS WORKM from M5000
group by WORKER,FIXHEAD,FIXBODY) M5000_temp,
(select FIXHEAD,FIXBODY,sum(P1) AS P1,sum(PARTTIME) AS PARTTIME from M5001
group by FIXHEAD,FIXBODY) M5001_temp
where M5000_temp.FIXHEAD=M5001_temp.FIXHEAD
and M5000_temp.FIXBODY=M5001_temp.FIXBODY
group by M5000_temp.WORKER
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-06-28 21:10:17 IP:211.78.xxx.xxx 訂閱
有支援這樣的語法嗎 ?
SELECT WORKER , LISTM,(SELECT SUM(P1) FROM M50l WHERE FH=A.FH AND FB=A.FB) AS P1,
(SELECT SUM(PARTTIME) FROM M501 WHERE FH=A.FH AND FB=A.FB) AS PARTTIME
FROM M500 A
WHERE
......

如果沒有我建議
1. 用兩段式語法 先處 M500 將結果存入暫存檔, 在 UPDATE M500 SET P1=(SELECT SUM(P1) FROM M501 WHERE ...)
編輯記錄
懷舊的人 重新編輯於 2008-06-28 21:11:49, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-07-04 22:34:35 IP:61.67.xxx.xxx 未訂閱
雖然沒有人解答出來, 但我想jackiemi2_seed所提出的方法在其他資料庫應該是可行的, 因為之前我也想過這樣的做法, 但FireBird就是不支援, 所以我還是把分數給jackiemi2_seed
HikaruGo
中階會員


發表:22
回覆:69
積分:88
註冊:2007-12-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-07-05 01:55:55 IP:61.62.xxx.xxx 訂閱
For MS-SQL 
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=92650




MSSQL 2K Help 有標準的SQL語法
系統時間:2024-05-04 18:59:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!