English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

我是vb新手,正在建構一資料庫系統假設現在有一顧客消費資料庫系統現在我想查詢某顧客消費記錄中..消費金額排中位數的消費記錄(非平均值)(消費記錄包含購買商品名稱、數量、金額、還有該次總消費金額等等)以SQL查詢可以做出來嗎?該怎麼做?假設顧客查詢欄為cumid,消費金額欄位為cash,顧客消費筆數為num我應該先計算該顧客消費筆數、以消費金額排序,然後再找出第 num/2 或 (num+1)/2 筆的資料並列出該筆相關資料...這樣的邏輯對嗎可是我不知道該怎麼正確寫出sql查詢的式子,請幫助我感謝

2006-06-06 12:34:25 · 5 個解答 · 發問者 show 4 in 電腦與網際網路 程式設計

在一個顧客消費資料庫系統中,我想查詢某顧客消費記錄中消費金額排中位數的消費記錄(假設A消費11筆,我想要消費金額第六多的相關記錄)
是這邊沒有描述清楚嗎?
謝謝提醒我

2006-06-06 13:21:42 · update #1

5 個解答

承蒙您看得起,我只好在這裡回覆(因你設定不接受網友來信,沒法回信給你XD)嗯!關於資料庫我只有Access且比較熟悉DAO(畢竟I'm Old Man)且SQL語法用來用去也是固定的幾招,不嫌棄的話您可試試看,專案須引用Microsoft DAO 2.5/3.51 Compatibility LiBrary'假設資料庫是C:\db1.mdb,資料表為Test,顧客查詢欄為cumid,消費金額欄位為cash,要查詢的顧客名稱為APrivate Sub Command1_Click()Dim db As Database, Rs As Recordset, X As Integer, T As Single, S As String'DAO開資料庫的語法Set db = OpenDatabase("C:\db1.mdb", False, False)'SQL語法,查詢的顧客名稱為AS = "SELECT [cumid], [cash] From Test Where [cumid]='A' GROUP BY [cumid],[cash] ORDER BY [cash];"'設Rs為此查詢之RecordsetSet Rs = db.OpenRecordset(S)'若Rs之記錄>0If Rs.RecordCount > 0 Then   Rs.MoveLast '移到最後1筆記錄(DAO必須要先移動記錄才能得知正確的RecordCount)   Rs.MoveFirst '移到第1筆記錄   X = Rs.RecordCount '顧客A之消費筆數   '若消費筆數為奇數則正中央的一個數即為中位數,否則正中央兩數的平均數即為中位數   If X Mod 2 Then      Rs.Move (X \ 2)      T = Rs("Cash")   Else      Rs.Move (X \ 2 - 1)      T = Rs("Cash")      Rs.MoveNext      T = (T + Rs("Cash")) / 2   End If   Print TEnd IfEnd Sub

2006-06-07 21:27:15 · answer #1 · answered by W.J.S. 7 · 0 0

select id,cash, expr1002
from (
 select pay1.id, pay1.cash, count(pay1.id)
  from (select id,cash from pay where id='XXX') pay1 ,(select id,cash from pay
  where id='XXX') pay2 where pay1.cash >= pay2.cash
 group by pay1.id, pay1.cash
) test
where expr1002 = (select round(count(id)/2,0) from pay group by id having id='XXX')

table名稱為pay,欄位有id和cash
我是用access的SQL語法select出來的出來的結果為
id cash expr1002
XXX 100 15
意思是XXX這位客戶所有購買記錄的中間筆數6金額為100
以你的意思用SQL一次撈出資料的話,雖然SQL一次就把資料拿出來..不過從語法得知此用法很耗資料庫(大量資料的話)...
如果有程式搭配的話,可利用程式去分散其運算能力..對主機會較好...
這件SQL是利用1個table做自身join達到N*N的record來計算筆數從1~N(資料量大很傷,因為我不曉有沒有內建程序可以直接把record以系統識別碼自動加上1~N,所
以以人工方法自動列出1~N..然後最後select round就是記算此客戶的中間筆數為多少再去下條件式....

2006-06-08 22:45:56 補充:
 id  cash  expr1002XXX  100   15意思是XXX這位客戶所有購買記錄按照順序的中間筆數15金額為100

2006-06-08 18:43:06 · answer #2 · answered by 小南 2 · 0 0

在SQL中的語法如下..
declare @counter smallint,@money money
set @counter = 1
set @money = 0
while (@counter<=20) --這個隨便啦
begin
if @counter =4 --看你要查第幾位數就改這個值
begin
select top 1 cash from 客戶消費資料 where cumid = 'A' and cash<@money order by 1 desc
break
end
else
begin
if @counter=1
begin
set @money = (select top 1 cash from 客戶消費資料 where cumid = 'a' and cash>@money order by 1 desc)
end
else
begin
set @money = (select top 1 cash from 客戶消費資料 where cumid = 'A' and cash<@money order by 1 desc)
end
set @counter = @counter+1
continue
end
end

如果是vb如下..
與資料庫連結部份省略,後續如下
rs.Open "select cash from 客戶消費資料 where cumid = 'a' order by 1 desc"
For i = 1 To 6 - 1
rs.MoveNext
Next i
MsgBox rs(0).Value

應該還要更簡單的方法,看其他大大提供囉 ^.^

2006-06-08 08:17:59 · answer #3 · answered by 粉累耶 2 · 0 0

先回答補充的問題(也許不是最好的解答喔)
SELECT LAST(money) FROM (SELECT TOP 6 money FROM userA ORDER BY money ASC)
or
SELECT TOP 1 money FROM (SELECT TOP 6 money from userA ORDER BY money
DESC)

試看看這個喔
不過 mysql 好像沒top x 和 last(x), 試試吧
有問題在問喔
也可以到我的tech bible留言謝謝
jebberwocky.tripod.com

2006-06-07 17:21:21 · answer #4 · answered by Jeffery 2 · 0 0

呀...還是看不太懂你要什麼@@?可以舉個實例嗎

2006-06-06 12:58:52 · answer #5 · answered by Ker 3 · 0 0

fedest.com, questions and answers