線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1115
推到 Plurk!
推到 Facebook!

求問一個查詢SQL的寫法

尚未結案
wscski
一般會員


發表:19
回覆:38
積分:11
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-25 10:40:03 IP:203.64.xxx.xxx 未訂閱
各位大大!小弟對SQL不是非常熟悉,請教一種查詢的SQL怎麼寫。 有兩個表格,一個是客戶資料表A、一個是目前服務客戶的客服人員表B 表格A NO NAME 1 陳 2 李 3 林 4 蔡 表格B(記錄每一個客戶換過哪些客服人員) NO SERVICE TIME(更改客服時間) 1 AAA 920101 1 BBB 920115 1 CCC 920120 2 CCC 920101 2 AAA 920118 3 AAA 920102 3 BBB 920111 3 CCC 920125 4 CCC 920105 現在我要查詢的目的是列出目前某位客服所服務的客戶有哪些 例如要查客服CCC,所以結果應該是 1 陳 3 林 4 蔡 不知道這樣的SQL要怎麼下? 感恩ㄋ!
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-25 11:41:57 IP:220.130.xxx.xxx 未訂閱
是MS-SQL SERVER嘛?! 下這樣試試看吧. select a.no,a.name from a,b where b.service='CCC' and b.no=a.no Best Regards, Rex Chiu
------
Best Regards,
Rex Chiu
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-25 11:49:50 IP:211.75.xxx.xxx 未訂閱
select * from 表格A ,表格B where 表格A.NO = 表格B.NO and 表格B.SERVICE = 'CCC' 語法 : 查詢 *所有欄位 from 表格 where(條件) 如果你只要列出某欄位 select 表格A.NO,表格A.NAME from.......... 語法中字串是不是用"" 或'' 是要看SQL的環境 自然就是寫程式最好的方式, 分享比獲得更快樂--Juneo
wscski
一般會員


發表:19
回覆:38
積分:11
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-25 12:10:23 IP:203.64.xxx.xxx 未訂閱
先感謝兩位大大指點,但是結果應該不是我要的,是我沒說清楚,很抱歉喔! 我要查目前某位客服所服務的客戶有哪些,表格B中記錄每一位客戶「經歷過」哪些客服,所以要查的是「最新」的客服。 照兩位大大的SQL查出來會把客戶編號2的也查出來,雖然編號2的客戶有被CCC服務過,但是最新的紀錄是AAA,所以該筆記錄不算。 總之就是每一位客戶都會「經歷」過好幾位客服,也許1位、也許好幾位,要查的是「最新」的。 這樣不知道有沒有說明清楚? 再次感謝兩位大大喔! 希望能再次指點我
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-25 12:28:07 IP:220.130.xxx.xxx 未訂閱
引言: 先感謝兩位大大指點,但是結果應該不是我要的,是我沒說清楚,很抱歉喔! 我要查目前某位客服所服務的客戶有哪些,表格B中記錄每一位客戶「經歷過」哪些客服,所以要查的是「最新」的客服。 照兩位大大的SQL查出來會把客戶編號2的也查出來,雖然編號2的客戶有被CCC服務過,但是最新的紀錄是AAA,所以該筆記錄不算。 總之就是每一位客戶都會「經歷」過好幾位客服,也許1位、也許好幾位,要查的是「最新」的。 這樣不知道有沒有說明清楚? 再次感謝兩位大大喔! 希望能再次指點我
嗯,因為你最新的條件不夠清楚, 1 CCC 920120 2 CCC 920101 3 CCC 920125 4 CCC 920105 看一下,何謂最新? 你給的答案是 1,3,4他們分別的時間是920120,920125,920105 我的疑問是既然920105也算最新滴,為何920101不是最新的? 因此你提問的條件要夠清楚 例如說,假設,最新的定義是,小於目前時間三天的資料 這樣就可以在where 後面再加上time的條件 select a.no,a.name from a,b where b.service='CCC' and b.no=a.no and datediff(day,getdate(),cast(b.time as datetime))<=3 ps.1 getdate()取得目前的時間 2.cast(b.TIME as datetime) 將你資料表B 欄位TIME轉換成日期時間型態 3.datediff()這是MS-SQL提供的funciton 可以計算二個時間的差異. 上例,是要求計算目前時間與B.TIME的時間差異的天數. Best Regards, Rex Chiu
------
Best Regards,
Rex Chiu
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-25 13:14:04 IP:210.65.xxx.xxx 未訂閱
Hi wscski,    假設同一時間每個客戶只有一個客服人員,亦即 service + time 在 TableB 為 Unique
SELECT  *
FROM    TABLE2 B,
        TABLE1 A
WHERE   B.NO = A.NO
AND     B.TIME = (SELECT  MAX(TIME)
                  FROM    TABLE2 B1
                  WHERE   B1.SERVICE = B.SERVICE)
AND     A.NO = :P_NO
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-25 13:26:48 IP:211.75.xxx.xxx 未訂閱
如果只是單純要求出最新的,用排序就可以找出你要的 例如:排序 取出筆數 SELECT * FROM account ORDER BY acc_number DESC 語法:ORDER BY 欄位 DESC ASC 遞增 DESC 遞減 另外提供給你Sql指令與用法 http://netlab.cse.yzu.edu.tw/~statue/cfc/docs/mysqldoc_big5/manual_toc.html 看看文件你應該會更清楚知道該怎麼寫語法 不是我不將整各語法寫給你,而是希望給你一根釣竿 自然就是寫程式最好的方式, 分享比獲得更快樂--Juneo
wscski
一般會員


發表:19
回覆:38
積分:11
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-25 15:14:52 IP:203.64.xxx.xxx 未訂閱
對不起各位,我沒說清楚,如同Fishman大所說的 「一個客戶同時只會有一個服務人員」 「一個服務人員同時會服務好幾個客戶」 「同一個客戶會換好幾個服務人員」 「以客服人員為參數,要查詢目前他正服務哪些客戶」 因此針對表B中 每一個客戶編號的GROUP,就是取時間最大的那筆。    Fishman大的語法中,我正在想怎麼修改成取時間MAX時,是取那一個編號GROUP中的最大,而不是該客服群組的最大    啊~~我想破頭 @@    還是要感謝各位大大的指教
wscski
一般會員


發表:19
回覆:38
積分:11
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-26 14:24:55 IP:203.64.xxx.xxx 未訂閱
< > 還是想不出來 有沒有大大可以再提點我一下 感恩喔!< >
Brian77
中階會員


發表:8
回覆:114
積分:94
註冊:2002-05-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-27 00:34:13 IP:61.221.xxx.xxx 未訂閱
SELECT B.NO,A.NAME
 FROM A,B,(SELECT NO,MAX(TIME) AS MT FROM B) C
 WHERE A.NO=B.NO AND B.TIME=C.MT AND B.SERVICE="CCC"
wscski
一般會員


發表:19
回覆:38
積分:11
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-02-27 15:41:46 IP:203.64.xxx.xxx 未訂閱
引言:
SELECT B.NO,A.NAME
 FROM A,B,(SELECT NO,MAX(TIME) AS MT FROM B) C
 WHERE A.NO=B.NO AND B.TIME=C.MT AND B.SERVICE="CCC"
我知道了! 原來如此! 多謝Brian77大大! 出來結果沒錯! 不過因為A、B兩表格資料料非常大,各有幾十萬筆,雖然都有INDEX 查詢效率還是不好,所以我要再去找找資料看怎樣改良這個語法 再次感謝Brian77
Brian77
中階會員


發表:8
回覆:114
積分:94
註冊:2002-05-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-27 22:32:47 IP:61.221.xxx.xxx 未訂閱
SELECT B.NO,A.NAME
 FROM (
  SELECT B.No FROM B,(SELECT NO,MAX(TIME) AS MT FROM B GROUP BY NO) C
  WHERE B.SERVICE="CCC" AND B.No=C.No AND B.TIME=C.MT
  ) CC LEFT JOIN A ON A.NO=CC.NO
不知改成匠有否提高效能..
系統時間:2024-11-23 7:29:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!