基于where子句的聚合行值

问题描述 投票:0回答:2

我想根据下面的col c组合行,并将它们的value列数据相加。行按照它们的组合方式进行颜色编码。

这需要发生在col a col bdate字段匹配的情况下,它只能发生在col c ='thing 1'或'thing 2'的地方。我不想为thing 1thing 2之外的任何东西组合匹配的行。

enter image description here

第一个问题,这在SQL或Pandas中更容易实现吗?

第二个问题:以最简单的方式,我将如何实现这一目标?

我的SQL尝试:

select col_a, col_b, date, SUM(value::numeric) as thing_1_thing_2 from mytable where col_c = 'thing 1' or col_c = 'thing 2' group by col_a, col_b, date;

但这并没有让我得到我期待的总结。此外,聚合本身会从输出中删除我仍然需要的列(例如上面未突出显示的行)。我只需要合并彩色行,其他所有行保持不变。

sql postgresql pandas
2个回答
1
投票

你可以选择你的thing 1thing 2行,并使用string_agg()聚合那些来连接你的值。然后UNION与你所有的非thing 1/thing 2行:

SELECT
    colA,
    colB,
    string_agg(colC,' ') as colC,
    date,
    sum(Value) as Value
FROM myTable
WHERE colC IN ('thing 1', 'thing 2')
GROUP BY colA, colB, date


UNION ALL

SELECT colA, colB, colC, date, value 
FROM myTable
WHERE colC NOT IN ('thing 1', 'thing 2')

或者,您可以将CASE语句抛入混合中,并在一次传递中执行此操作:

SELECT
    colA,
    colB,
    CASE WHEN colC IN ('thing 1', 'thing 2') THEN 'Thing 1 Thing 2` ELSE colC END as colC,
    date,
    sum(Value) as Value
FROM myTable
GROUP BY colA, 
    colB, 
    CASE WHEN colC IN ('thing 1', 'thing 2') THEN 'Thing 1 Thing 2` ELSE colC END,
    date

我认为第一个更具可扩展性,你不必使用硬编码字符串,只需要WHERE子句。


0
投票

这样的事怎么样?

SELECT colA, colB, colC, date, SUM(value) FROM table
WHERE colC in ('thing 1', 'thing2')
GROUP BY colA, colB, colC, date
© www.soinside.com 2019 - 2024. All rights reserved.