2012-07-07 83 views
5

表中:SQL查詢來選擇與非集合值表達和聚集函數列

1)V(日期d,名稱C(25),遞減C(50),借記N( 7),信用N(7))

名稱在 'v' 在VN表是指名稱

2)VN(日期d,名稱C(25),C型(25),10:28 N(7 ))

'vn'中的名稱是主鍵,不同的名稱按類型分組

例如:姓名ABC,DEF,GHI屬於輸入 '銀行',名字XYZ,PQR屬於輸入 '臺賬',...

我有這樣的查詢:

它工作正常,但唯一的問題是,obal是一個值,它只在表'vn'中爲每個名稱輸入一次,但對於表'v'中的每個信用借方計算,obal都會多次添加並在OpBal下顯示。當查詢修改如下:

SELECT vn.type, vn.obal + SUM(IIF(v.date < sd, v.credit-v.debit, 0)) OpBal, ; 
    SUM(IIF(BETWEEN(v.date, sd, ed), v.credit-v.debit, 0)) CurBal ; 
    FROM v, vn WHERE v.name = vn.name GROUP BY vn.type ; 
    ORDER BY vn.type HAVING OpBal + CurBal != 0 

它顯示錯誤消息,如「組by子句丟失或無效」!

使用RDBMS MS Visual Foxpro 9 sd和ed是用於查詢的日期類型變量,其中sd < ed。

請幫我拿出預期的結果。非常感謝。

+0

您需要在'vn'表中進行分組,然後將該結果加入到您的查詢中。 – 2012-07-07 08:01:27

+0

@Dems:我在想'GROUP BY vn.type'查詢需要什麼。用'GROUP BY類型,obal',我認爲你的答案沒問題。 (順便說一下,在Foxpro中的'ORDER BY'有效的語法後面是'HAVING'嗎?它讓我想知道) – 2012-07-07 08:07:07

+0

而且我認爲'vn'的主鍵是'name',通過描述。 – 2012-07-07 08:10:13

回答

0

我看到SQL語法SQL與VFP首次在幾分鐘前,所以這很可能是完全錯誤的,但作爲一個「guessful預感」:

SELECT vn.type, 
     SUM(vn.obal + (SELECT SUM(IIF(v.date < sd, v.credit-v.debit, 0)) 
         FROM v 
         WHERE v.name = vn.name)) OpBal, 
     SUM(SELECT SUM(IIF(BETWEEN(v.date, sd, ed), v.credit-v.debit, 0)) 
      FROM v 
      WHERE v.name = vn.name) CurBal 
FROM vn 
GROUP BY vn.type 
ORDER BY vn.type 
HAVING OpBal + CurBal != 0 

基本上,我我只是把選擇從v變成子選擇,以避免vn.obal重複。對於v而言,在將它們總結在一起之前,它首先得到個人的總和並不重要。

+0

設置,對不起!它產生一個錯誤信息:'功能名稱丟失'。'' – Ganapathy 2012-07-07 15:02:00

0

只是幾件事。 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作爲任何查詢之後的基礎......它有助於不必嵌套查詢內部查詢內部查詢。它還可以讓你看到每一層的結果,並知道你正在得到你正在回答的答案,然後繼續下一個查詢階段...

希望這會幫助你在你想要解決的方向。