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

表格问题

答題得分者是:st33chen
nadawudi
一般會員


發表:6
回覆:7
積分:2
註冊:2008-12-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-01-20 10:11:25 IP:221.200.xxx.xxx 訂閱
各位好,小弟有个问题急需帮助:
我有一个表,表格式大概如下:

店名 产品 数量 价格 (4个字段)
1 青苹果 17 20
空白 火龙果 200 1362
空白 丽佳果 19 65
空百 哈秘瓜 20 300
2 青苹果 25 300
空白 火龙果 200 1400
空白 丽佳果 20 70
空白 哈秘瓜 20 320
3 青苹果 15 15
空白 丽佳果 30 450
空白 火龙果 20 150
空白 哈秘瓜 20 280

我现在想通过一个按件上写SQL语句能够使当记录指针在店名字段为1时开始,后面该字段的空白初自动填上1,一直到字段值变为2位置,后面的字段值全为2,一直到3,以此类推.
另外如果SQL不能解决,能够用其他方法吗.
如有高人指点,小弟感激不尽
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-01-20 21:30:41 IP:122.116.xxx.xxx 未訂閱
您好,
這題我覺得首先要確定
1. 您是 只要查詢資料 還是 要把資料寫回資料
如果是 要查詢資料, 那
2. 使用何種 db engine
3. keyfield 是什麼(照經驗 keyfield 應為 店名, 產品 但是和您的提供的資料矛盾)

假設 要把資料寫回資料表, 那我覺得用最直觀的方法最快 :

var astr : string;
query1.sql.text :='select 店名, 產品, 數量, 价格 from table1';
query1.open;
while not query1.eof do begin
if trim(query1.fieldbyname('店名').asstring)<>'' then
astr := query1.fieldbyname('店名').asstring
else begin
query1.edit;
query1.fieldbyname('店名').asstring := astr;
query1.post;
end;
query1.next;
end;
query1.close;
沒實測, 請您自行測一下.

如果是查詢資料, 又是 oracle, 請參考
http://blog.xuite.net/st33chen/oracle/21917683
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-01-20 21:35:24, 註解 無‧
P.D.
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-01-20 22:31:27 IP:61.67.xxx.xxx 未訂閱
如果資料真如你所列示的安排的話, 最直接的寫法就是利用迴圈, 我只寫個大概沒有實測
假設table name 是 mydata

var i: integer;
fdvalue: integer;
begin
i:= 0;
mydata.first;
while not mydata.eof do begin
fdvalue:= StrtoIntDef(mydata.FieldByName('店名').AsInteger,0)
if fdvalue<>0 then i:= fdvalue
else begin
mydata.edit;
mydata.FieldByName('店名').Value:= InttoStr(i);
mydata.post;
end;
mydata.next;
end;
end;

當然, 整個回存我不知道你用什麼資料庫, 請自行參考其他資訊
寫法萬千種, 任人自由發揮
===================引 用 nadawudi 文 章===================
各位好,小弟有个问题急需帮助:
我有一个表,表格式大概如下:

店名 产品 数量 价格 (4个字段)
1 青苹果 17 20
空白 火龙果 200 1362
空白 丽佳果 19 65
空百 哈秘瓜 20 300
2 青苹果 25 300
空白 火龙果 200 1400
空白 丽佳果 20 70
空白 哈秘瓜 20 320
3 青苹果 15 15
空白 丽佳果 30 450
空白 火龙果 20 150
空白 哈秘瓜 20 280

我现在想通过一个按件上写SQL语句能够使当记录指针在店名字段为1时开始,后面该字段的空白初自动填上1,一直到字段值变为2位置,后面的字段值全为2,一直到3,以此类推.
另外如果SQL不能解决,能够用其他方法吗.
如有高人指点,小弟感激不尽
nadawudi
一般會員


發表:6
回覆:7
積分:2
註冊:2008-12-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-01-21 11:19:27 IP:221.200.xxx.xxx 訂閱
通过你的方法,问题解决了,
但是我想实现另外一个功能
我通过SQL.text:='select 产品,sum(价格) as sum_价格 from table1 group by 产品';这句查出了整个表格所有的同类产品的各自的总价;
但是我现在是想在店名为1所有记录中查出所有同类产品的总价,(由于为了方便我上面的表格中每个店名中的产品只有一项,而实际上同类产品有很多项,只是数量不同,单次价格也就不一样),并插入一些新记录,这些新记录分别插入到店名1中所对应的产品类后面,用于显示店名1中各种产品的总价[这些记录包括店名,产品,数量,价格(这个字段为空),sum_价格(新字段)]
我的表店名1中已经按照产品种类顺序排好,希望各位高手能够帮帮我,谢谢
===================引 用 st33chen 文 章===================
您好,
這題我覺得首先要確定
1. 您是 只要查詢資料 還是 要把資料寫回資料
如果是 要查詢資料, 那
2. 使用何種 db engine
3. keyfield 是什麼(照經驗 keyfield 應為 店名, 產品 但是和您的提供的資料矛盾)

假設 要把資料寫回資料表, 那我覺得用最直觀的方法最快 :

var astr : string;
query1.sql.text :='select 店名, 產品, 數量, 价格 from table1';
query1.open;
while not query1.eof do begin
if trim(query1.fieldbyname('店名').asstring)<>'' then
astr := query1.fieldbyname('店名').asstring
else begin
query1.edit;
query1.fieldbyname('店名').asstring := astr;
query1.post;
end;
query1.next;
end;
query1.close;
沒實測, 請您自行測一下.

如果是查詢資料, 又是 oracle, 請參考
http://blog.xuite.net/st33chen/oracle/21917683
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-01-21 12:04:16 IP:122.116.xxx.xxx 未訂閱
mssql, mysql :

select 店名, 產品, sum(价格) as sum_价格
from table1
group by 店名, 產品 with rollup

oracle :

select 店名, 產品, sum(价格) as sum_价格
from table1
group by rollup(店名, 產品)

或請自行 google 一下 rollup
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
nadawudi
一般會員


發表:6
回覆:7
積分:2
註冊:2008-12-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-01-21 15:59:38 IP:221.200.xxx.xxx 訂閱
这样只能查找,如何将各产品的总值添加到各类产品记录的后一个记录呢
能够用一句SQL语句完成吗,我现在是一条条填在空件里加进去,太麻烦
我的表给类产品是分开的,也就是一种产品可能有10条信息,占了前10个记录,后面又是另一种产品,产品在排序方面没有混淆,
我想的是查找完后,程序可以自动的在各类产品的记录后面添加一个该产品的总价.
===================引 用 st33chen 文 章===================
mssql, mysql :

select 店名, 產品, sum(价格) as sum_价格
from table1
group by 店名, 產品 with rollup

oracle :

select 店名, 產品, sum(价格) as sum_价格
from table1
group by rollup(店名, 產品)

或請自行 google 一下 rollup
編輯記錄
nadawudi 重新編輯於 2009-01-21 16:04:06, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-01-21 16:17:36 IP:118.168.xxx.xxx 未訂閱
依個人經驗, 
加總資料列要寫回資料庫
對日後資料庫的 MAINTAIN 會增加不必要的困難度
(例如, 改天資料變了, 這時就不能新增一筆加總資料列, 而是找到舊的那筆並更新)

若一定要那樣, 建議
1. 資料庫保持明細資料,
2. 用 ROLLUP QUERY 到的資料整個寫到一個新的資料表或是 EXCEL 或 CSV 或 TXT 檔
例如 : 寫到一個新資料表(算是暫存檔, 每次寫前可以先 清檔, 動作比較簡單)
INSERT INTO TABLE2
SELECT ..... FROM TABLE1 WHERE .... GROUP BY ... WITH ROLLUP;
3. 您要的表就在 TABLE2


------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
系統時間:2024-05-05 1:46:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!