小弟有兩個表,分表是母子表pos_orderlist,pos_ordergoods, pos_orderlist是用來記銷售單的,pos_ordergoods是用來記每一張銷售單的明細,我想將2008-05-01到2008-05-04這四天的銷售明細裡的所有單項找出並加總起來,我是有用了一個語法來做,我看了結果是沒有錯啦,但總覺得怪怪的,麻煩大家指教一下
SELECT b.name,sum(b.amount) mount,a.totalprice,b.pid,b.code,a.orderdate FROM pos_orderlist a join pos_ordergoods b on a.orderid=b.orderid WHERE a.orderdate>='2008-05-01' and a.orderdate<='208-05-04' and depno='106' group by b.code order by b.code
這樣子的語法是否是正確的呢?
0000001000054 2008-05-05 2 A
0000003100028 2008-05-05 2 B
0000002000251 2008-05-05 1 C
0000000000000 2008-05-05 2 D
0000003100028 2008-05-05 3 B
0000001001358 2008-05-05 3 E
那麼小弟再請教,這個資料表是我用
select a.code,date(a.update_date) as update_date,sum(a.mount) as mount,b.name from beautyfarm_dep_stockroom_log a join iso_product b on a.code=b.code where date(a.update_date)>='2008-05-05' and date(a.update_date)<='2008-05-05' and a.event='1' and a.dep_no='69' group by a.code,b.name,date(a.update_date),a.mount
撈出來的,但結果卻不是我要的,我要的是如下
code update_date mount name
0000001000054 2008-05-05 2 A
0000003100028 2008-05-05 5 B
0000002000251 2008-05-05 1 C
0000000000000 2008-05-05 2 D
0000001001358 2008-05-05 3 E
應該是品項B應該被加總才對,這個問題我試了好久都試不出來,麻煩高手指導一下...拜託...
資料庫是postgresql
ievson wrote:
那麼我應該把非sum...(恕刪)
1. 書請看清楚.
2. 台灣爛書多, 寫錯很正常.
假設(A, B, C)有四個資料(某甲, 1月1號, 10元), (某甲, 1月2號, 3元), (某甲, 1月2號, 7元), (某乙, 1月3號, 5元)
試問,
SELECT A, B, SUM( C )
FROM MyTable
GROUP BY A
該出現什麼答案才對? 某些寬鬆的SQL不給錯誤訊息, 卻會亂給答案, 但那東西根本就不符規範.
舉例來說, 上面這個式子, 若選出來是
a. (某甲, 1月1號, 20元), (某乙, 1月3號, 5元) 這答案對嗎? 不對呀, 某甲在1月1號分明只有10元.
b. (某甲, 1月2號, 20元), (某乙, 1月3號, 5元)也不對哇..
所以變成(某甲, ???, 13元), 中間的???該代入什麼值?
也因此, 不在SUM()裡面的欄位, 一定要在GROUP BY裡面. 照你原本的寫法, 你根本不知道你要加總什麼東西.
若寫成
SELECT A, B, SUM( C )
FROM MyTable
GROUP BY A, B
則這個SQL的含意就很明顯, 你要的是: (某甲, 1月1號, 10元), (某甲, 1月2號, 10元), (某乙, 1月3號5元)
若你說, 我只要每天幾塊錢, 則會變成
SELECT B, SUM( C )
FROM MyTable
GROUP BY B
答案是(1月1號, 10元), (1月2號, 10元), (1月3號, 5元) 因為根本不需要某甲某乙, 所以A這個欄位本來就不該選進去.
還有, SELECT X, SUM( X ) GROUP BY X 這類的東西也是邏輯不通, 要加總的值然再用這個值來分組, 真的是會昏倒.
但是, SELECT Month( X ), SUM( Y ) GROUP BY Month( X )卻是通的, 因為我要按月分組計算Y的和.
再來, 程式裡寫SQL雖然是以字串型式寫成一整行, 但是你單獨出來問人家SQL時, 請注意撰寫格式, 記得分行..
像是寫成:
SELECT A, B, SUM( C )...
FROM Table1, Table2, ...
WHERE 條件1 AND 條件2 ....
GROUP BY A, B, ...
ORDER BY A, B, ....
應分成五行來寫
另外, 資料庫不及格的外行人別插話, 什麼選出來是要的答案即可. 原PO的SQL本來就有錯誤, 差別只在不同的資料庫會給出不同的東西罷了. 碰巧找到他想要的答案不代表它本身沒錯, 更多時後是因為資料量太少或者是他看不出選到錯誤答案所致.
公喵不帥, 母喵不愛. 公喵愈壞, 母喵愈愛. 不帥的公喵想要母喵愛, 就只好學壞.
SELECT b.name,sum(b.amount) mount,b.code,a.orderdate
FROM pos_orderlist a join pos_ordergoods b on a.orderid=b.orderid
WHERE a.orderdate>='2008-05-01' and a.orderdate<='208-05-04' and depno='106'
group by b.code
order by b.code
改成
SELECT b.name,sum(b.amount) mount,b.code,a.orderdate
FROM pos_orderlist a join pos_ordergoods b on a.orderid=b.orderid
WHERE a.orderdate>='2008-05-01' and a.orderdate<='208-05-04' and depno='106'
group by b.code,b.name
order by b.code
看完sambad大的回覆,讓我的觀念有著成長
照sambad大所說的我把原sql改成上述的樣子,但我原本想如果把group by b.code,b.name多加入a.orderdate
這樣子應該就會回傳多列,例如回傳
a,10,001,2008-05-01
a,10,001,2008-05-02
a,10,001,2008-05-03
b,1,002,2008-05-02
所以我如果是想要回傳
a,10,001
b,1,002
就不能把a.orderdate加入了吧?因為orderdate可能有好幾天,就不適合加入進行分析了吧?
如果是照sambad所提示的,不知道我這樣子的觀念是否正確呢?



























































































