2015-10-02 65 views
0

我正在開發一個需要嵌入式數據庫的應用程序,所以我使用MYSQL來設計它,並創建了一個SQL語句在那裏工作。但是,在轉移到嵌入式數據庫(即超SQL(HSQLDB))時,我的查詢不再有效。這似乎與我在select中必須與Group By匹配的參數數量有關,但是如果我去添加它們,它將保持數據未分組,並且這對我不起作用。用分組方式選擇不能正常工作

下面是該查詢:

我有兩個表(GFS和人聯黨),與同列,所不同的是在行爲和一個擁有人口更多的列了另外一個。

SELECT gfs.GFSAccount, gfs.GLAccount, 
     CASE 
     WHEN gfs.ICPartner = "" THEN '[ICP_NONE]' 
     WHEN gfs.ICPartner <> "" THEN gfs.ICPartner 
     END AS ICPartner, 
     CASE 
     WHEN gfs.PPESupplementalData <> '' THEN gfs.PPESupplementalData 
     WHEN gfs.PPESupplementalData = '' THEN '[NONE]' 
     END AS SupplementalData, 
     CASE 
     WHEN gfs.AccountType = 'SALES AND COS' THEN gfs.PCode 
     WHEN gfs.AccountType = 'COO' THEN 'COO' 
     WHEN gfs.AccountType = 'OTHERS' THEN gfs.Business 
     END AS Business, 
     Round(Sum(gfs.Amount), 2) AS Amount 
FROM gfs, supp 
WHERE gfs.GLAccount <> supp.GLAccount 
GROUP BY gfs.GFSAccount, 
     CASE WHEN gfs.ICPartnerSplit = 1 THEN gfs.ICPartner END 

UNION 

SELECT GFSAccount, GLAccount, 
     CASE 
     WHEN ICPartner = "" THEN '[ICP_NONE]' 
     WHEN ICPartner <> "" THEN ICPartner 
     END AS ICPartner, 
     CASE 
     WHEN SuppData <> '' THEN SuppData 
     WHEN SuppData = '' THEN '[NONE]' 
     END AS SupplementalData, 
     Business, Round(Sum(Amount), 2) AS Amount 
FROM supp 

ORDER BY GFSAccount; 

有很大量的轉換空白和固定領域,但主要問題是與3組由(2內的每一個選擇,一個在盡頭),它沒有讓我做到這一點。

(我知道查詢本身是不是最好的創建或優化,但我從一個數據庫時已經出來,我有點生鏽)

有任何建議你們可以爲了使它在HSQLDB(或另一個不是MySQL的數據庫)中工作對我做?

+0

考慮編輯您的問題和格式化您的查詢。 –

+0

「不再工作」不是您可以提供的最佳信息。解釋查詢應該完成的操作總是有幫助的。 –

+2

看起來像是另一個MySQL的流氓執行「GROUP BY」咬人你的案例。在標準SQL中,所有列(不是功能依賴的)都不在GROUP BY子句中列出,必須是聚合的一部分。 MySQL只是從每個組中挑選一個任意的行。 Postgres遵守標準(主要是),主鍵分組覆蓋了表的其餘部分,但沒有觀察到其他函數依賴關係。相關答案[here](http://stackoverflow.com/a/8440512/939860)或[here](http://stackoverflow.com/a/18993394/939860)。 –

回答

1

看來,要選擇從gfs表中的數據,但只有當GLAccount是不存在的supp。你需要一個LEFT JOIN來做到這一點。否則,您需要GROUP BYsum()函數中未使用的所有列。你可以簡化你的CASE報表。對於PostgreSQL查詢則是這樣的:

SELECT gfs.GFSAccount, gfs.GLAccount, 
     CASE gfs.ICPartner 
     WHEN '' THEN '[ICP_NONE]' ELSE gfs.ICPartner 
     END AS ICPartner, 
     CASE gfs.PPESupplementalData 
     WHEN '' THEN '[NONE]' ELSE gfs.PPESupplementalData 
     END AS SupplementalData, 
     CASE gfs.AccountType 
     WHEN 'SALES AND COS' THEN gfs.PCode 
     WHEN 'COO' THEN 'COO' 
     WHEN 'OTHERS' THEN gfs.Business 
     END AS Business, 
     round(sum(gfs.Amount), 2) AS Amount 
FROM gfs 
LEFT JOIN supp USING (GLAccount) 
WHERE supp.GLAccount IS NULL 
GROUP BY 1, 2, 3, 4, 5, 6 

UNION 

SELECT GFSAccount, GLAccount, 
     CASE ICPartner 
     WHEN '' THEN '[ICP_NONE]' ELSE ICPartner 
     END AS ICPartner, 
     CASE SuppData 
     WHEN '' THEN '[NONE]' ELSE SuppData 
     END AS SupplementalData, 
     Business, round(sum(Amount), 2) AS Amount 
FROM supp 
GROUP BY 1, 2, 3, 4, 5, 6 

ORDER BY GFSAccount; 

如果各個列NULL,而不是一個空字符串''你應該改變CASE語句coalesce(gfs.ICPartner, '[ICP_NONE]') AS ICPartner

+0

只是一個問題,GROUP BY中的數字指的是什麼? – jarlh

+1

@jarlh:選擇列表中的列索引 –