2017-07-04 240 views
0

是否有可能做這樣的查詢?我有ID,一些IN值,Out值和最後一列TOTAL是IN和OUT之差的總和。我真的需要完整的總和。 相等的ID2行必須在SUM列中相加。沒有固定的ID2數量,有時它只是一行總和,其他情況下會有更多。我還可以添加一個差異列,以便將該行中的值與相同的ID2相加。總計行其他列列值按其他列分組ID

我在這裏懷疑的是,是否有可能在一行中累加,在其他列的某些行累積?

ID ID2 IN OUT TOTAL (IN-OUT) 
1 2 200 150 blank-null-space-or whatever but a character 
2 2 350 250 doesn't matter, also it can have the same SUM result as below 
3 2 600 400 350 (= 200 - 150 + 350 - 250 + 600 - 400) 
4 3 100 80 20 

或者我必須在JavaScript的客戶端做到這一點?哪個更好,或者你有建議?也許在JavaScript中更容易,但我希望一步到位就可以減少池連接。

一個簡單的核實的例子是

CREATE TABLE "table1" (
    "ID" int NOT NULL, 
    "ID2" int DEFAULT NULL, 
    "`EXT_ID" int DEFAULT NULL, 
    "IN" int DEFAULT NULL 
    "OUT" int DEFAULT NULL 
); 

INSERT INTO "table1" ("ID", "ID2", "EXT_ID", "IN", "OUT") VALUES 
(1, 2, 1, 200, 150), 
(2, 2, 2, 350, 250), 
(3, 2, 2, 600, 400), 
(4, 3, 4, 100, 80), 
(5, 3, 5, 130, 100), 
(6, 4, 6, 100, 80), 
(7, 4, 7, 120, 70), 
(8, 4, 7, 150, 90); 

EDIT:添加了一個外國ID欄「EXT_ID」具有一個條件節目只有一排,並且由相同的「ID2」具有MAX值的一個。

更正的SQL語法。

+0

嗨,卡洛斯。你改變了這個問題。更好的爲stackoverflow發佈一個新的問題。這樣就保留了原始問題的正確答案。 –

+0

好的,你是否建議恢復編輯? –

+0

它並不是真的有必要將其反轉 –

回答

1

編輯

是的,這是更多鈔票。您可以通過使用組(如果你只想要總)

CREATE TABLE "table1" (
    "ID" int NOT NULL, 
    "ID2" int DEFAULT NULL, 
    "EXT_ID" int DEFAULT NULL, 
    "IN" int DEFAULT NULL, 
    "OUT" int DEFAULT NULL 
); 

INSERT INTO "table1" ("ID", "ID2", "EXT_ID", "IN", "OUT") VALUES 
(1, 2, 1, 200, 150), 
(2, 2, 2, 350, 250), 
(3, 2, 2, 600, 400), 
(4, 3, 4, 100, 80), 
(5, 3, 5, 130, 100), 
(6, 4, 6, 100, 80), 
(7, 4, 7, 120, 70), 
(8, 4, 7, 150, 90); 

select "ID2", sum("IN" - "OUT") 
    from "table1" 
    group by "ID2"; 

result 1

老答案:

是的,這是更多鈔票。您可以使用窗口函數

CREATE TABLE "table1" (
    "ID" int NOT NULL, 
    "ID2" int DEFAULT NULL, 
    "IN" int DEFAULT NULL, 
    "OUT" int DEFAULT NULL 
); 

INSERT INTO "table1" ("ID", "ID2", "IN", "OUT") VALUES 
(1, 2, 200, 150), 
(2, 2, 350, 250), 
(3, 2, 600, 400), 
(4, 3, 100, 80); 

select * , sum("IN" - "OUT") over (partition by "ID2" order by "ID") 
    from "table1" 
    order by "ID2", "ID"; 

result 2

正如你在https://www.postgresql.org/docs/current/static/functions-window.html

看到的功能例如:http://rextester.com/OVCTC74070

+0

mmm好吧,我不知道這個功能,讓我看看並閱讀文檔..謝謝,這會給我一些其他的觀點。 –

+0

好的,這是最能解決問題的那個。但是我從一開始就沒有很好地解釋自己,所以我仍然面臨一些麻煩,因爲在我的實際環境中,我想要過濾以獲得自上週以來的最新數據,但是上個星期過去了,但這是另一個話題..謝謝@ emilio-platzer –

+0

問問。我們會幫助你。 –

1

試試這個?

select (SUM(`IN` - `OUT`)) as 'Total' 
from (
    select * 
    from table1 
    where ID2 IN (select ID2 from table1 where ID = "3") 
) as temptable; 

但是這隻能得到1行的結果,您可能需要編輯它。

+0

好吧,這給了我一個想法,我可以使用這個「N」次,並使用「UNION ALL」在彼此之間。即使這會花費另一個查詢並通過JavaScript加入。謝謝!! –