只是幾件事。 VFP 9有一個設置,不需要爲所有非聚合進行分組以獲得向後兼容性以及類似的結果,如MySQL,其中並非所有列都必須聚合。例如,查詢客戶記錄中的額外列,無論您在PK列(名稱,地址,電話,無論)上加入多少條記錄都不會改變。
SET ENGINEBEHAVIOR 80
默認爲VFP 9
SET ENGINEBEHAVIOR 90
要求所有非組按列以聚集體遵守。
接下來......看起來你在處理的表格中有很差的列...... VFP中有3個保留字......「date」,「Name」和「type」,但是你沒事通過在查詢中用alias.column引用來限定它們。
以下示例代碼將創建您在問題中描述的結構的臨時表(遊標)。我還插入一些示例數據和模擬的「SD」(開始日期)和「ED」(結束日期)變量
CREATE CURSOR vn;
(date d, ;
name c(25), ;
type c(25), ;
obal n(7))
INSERT INTO vn VALUES (CTOD("5/20/2012"), "person 1", "person type 1", 125)
INSERT INTO vn VALUES (CTOD("5/20/2012"), "person 2", "another type ", 2155)
CREATE CURSOR v;
(date d, ;
name c(25), ;
desc c(50), ;
debit n(7), ;
credit n(7))
INSERT INTO V VALUES (CTOD("6/1/2012"), "person 1", "description 1", 10, 32)
INSERT INTO V VALUES (CTOD("6/2/2012"), "person 1", "desc 2", 235, 123)
INSERT INTO V VALUES (CTOD("6/3/2012"), "person 1", "desc 3", 22, 4)
INSERT INTO V VALUES (CTOD("6/4/2012"), "person 1", "desc 4", 53, 36)
INSERT INTO V VALUES (CTOD("6/5/2012"), "person 1", "desc 5", 31, 3)
INSERT INTO V VALUES (CTOD("6/1/2012"), "person 2", "another 1", 43, 664)
INSERT INTO V VALUES (CTOD("6/4/2012"), "person 2", "more desc", 78, 332)
INSERT INTO V VALUES (CTOD("6/6/2012"), "person 2", "anything", 366, 854)
sd = CTOD("6/3/2012") && start date of transactions
ed = DATE() && current date as the end date...
現在,查詢......你試圖通過類型獲得團體,但每個人(姓名)需要按照每人的基礎進行預先彙總。現在,您似乎試圖在開始日期(sd)之前將交易的總期初餘額作爲給定時間點的基礎,然後查看相關開始/結束日期內的活動。首先執行此操作,但不涉及從「vn」表添加「obal」列。由於它需要非列組的聚合,所以我只需使用該列的「MAX()」。由於它是以PK(名稱)爲基礎的,因此您最終會得到它所做的任何事情,但是通過彙總的交易總量,您還可以將所有數據預先彙總爲單行通過...
select;
vn.name,;
vn.type,;
MAX(vn.obal) as BalByNameOnly,;
SUM(IIF(v.date < sd, v.credit-v.debit, 000000.00)) OpBal, ;
SUM(IIF(BETWEEN(v.date, sd, ed), v.credit - v.debit, 000000.00)) CurBal ;
FROM ;
v,;
vn ;
WHERE ;
v.name = vn.name;
GROUP BY ;
vn.Name,;
vn.Type;
INTO ;
CURSOR C_JustByName READWRITE
有了這個結果(從我的樣本數據)會是什麼樣子......
Name Type BalByNameOnly OpBal CurBal
person 1 person type 1 125 -90 -63
person 2 another type 2155 621 742
你最後的總按類型來獲得,你可以查詢上述結果「光標」(C_JustByName),並用它得到你的分組類型,有,等等...像
SELECT ;
JBN.type, ;
JBN.BalByNameOnly - JBN.OpBal as OpBal,;
JBN.CurBal ;
FROM ;
C_JustByName JBN ;
GROUP BY ;
vn.type ;
ORDER BY ;
vn.type ;
HAVING ;
OpBal + CurBal != 0;
INTO ;
CURSOR C_Final
現在,我只是簡化了上述內容,因爲我不知道您真正在尋找什麼作爲您的「VN」(看起來像客戶表)中的日期,並且日期不清楚它的目的和它的目的關於交易表的oBal列。
關於VFP的好處是,你可以查詢到一個臨時遊標,而無需創建一個永久表,並使用IT作爲任何查詢之後的基礎......它有助於不必嵌套查詢內部查詢內部查詢。它還可以讓你看到每一層的結果,並知道你正在得到你正在回答的答案,然後繼續下一個查詢階段...
希望這會幫助你在你想要解決的方向。
您需要在'vn'表中進行分組,然後將該結果加入到您的查詢中。 – 2012-07-07 08:01:27
@Dems:我在想'GROUP BY vn.type'查詢需要什麼。用'GROUP BY類型,obal',我認爲你的答案沒問題。 (順便說一下,在Foxpro中的'ORDER BY'有效的語法後面是'HAVING'嗎?它讓我想知道) – 2012-07-07 08:07:07
而且我認爲'vn'的主鍵是'name',通過描述。 – 2012-07-07 08:10:13