2017-07-04 116 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加入。谢谢!! –