其實遇到的問題,跟這篇差不多
http://www.javaworld.com.tw/jute/post/view?bid=21&id=259674&sty=1
MSSQL如果有張Table
序號Seq----股票-----帳戶------交易日---------結算金額
(自1 A股票 A帳戶 2011/02/13 100
動2 A股票 A帳戶 2011/02/14 200
編3 A股票 B帳戶 2011/02/13 100←User只想顯示這筆
號4 A股票 A帳戶 2011/02/14 300←User只想顯示這筆
想要依帳戶Group By 又要Top(1)交易日,只出現最新一筆??
朋友先交我
select * from XXX where 帳戶,交易日 in (select (帳戶,max(交易日)) group by 帳戶 )
但是試了發現無法解決同一天多筆交易,朋友提供另一個解決方法
select * from xxx a where exists ( select top 1 from xxx b where a.seq=b.seq group by 股票 帳戶 order by 交易日 desc)
查了一下,exists 是後面()有成立才執行前面式子,但是後面如何a.seq=b.seq 還是沒想通。
最後解決的方法是
select * from ←這邊的*先打*讓他全出現,之後再留要的比較快
(select max(ID) as ID, Name,Max(Time), Message from mytable group by Name) AS A
left join mytable B ↑_這邊子查詢會SELECT出要的幾筆,+了Max(ID)可避免掉同天多筆交易
↑這邊要注意Left Join ,意思是A要的那幾筆跟所有查詢的資料。
on A.Name=B.Name and A.ID=B.ID;
但是我的B其實沒那麼單純,是JOIN了4張表出來的,並且有WHERE條件。
WHERE條件依然是放在最後一段,A.ID=B.ID的後面。
B應該是放(XXX JOIN YYY ON XXX.seq=YYY.seq.....接4段FROM之後的table名)
但是太亂太雜測試不出來,便用VS的查詢工具,執行完上面查詢已經出現A B 2個Tabel ,用設計工具加入剩的4個Tabel,VS會自動幫你JOIN好,並且原本的Left Join 也變Right Join(因為AB放的位置變顛倒)
Left Join 跟Right Join 其實是 2 x 3= 6 ,被乘數與乘數的關係