PostgreSQL - 计数和案例相结合

时间:2018-03-05 16:42:36

标签: postgresql case aggregate-functions

我有以下SQL语句:

SELECT sk.kontonummer as Sachkonto, 
CASE WHEN COUNT(*) > 2 ktr.kostentraeger_nr + ' 
 and more' 
ELSE ktr.kostentraeger_nr END,
 (...) 

结果,我可以获得2行或更多行。 当我得到3行或更多行时,我想在"ktr.kostentraeger_nr"'以及更多'之后写入。 (作为字符串),如果不是,那么只有结果本身。

由于count函数,查询本身不可执行 - 粗体文本只是我认为它应该如何工作的想法。 有没有办法满足我的要求?

澄清我的要求一个例子: enter image description here

非常感谢你,因为这个问题,我已经浪费了一整天......

1 个答案:

答案 0 :(得分:1)

您只需使用OVER()即可。不知道您的查询或数据库结构,但这是一个应该有用的简单示例。

让我们有一个测试

id | integer_value | text_value
---+---------------+------------
1  | 5             | a
2  | 7             | b
3  | 8             | c
4  | 1             | d

要获得实际查询的COUNT,我们使用窗口函数OVER()

SELECT id,integer_value
    CASE
-- since you have to add text, the integer must be cast as text.
        WHEN COUNT(*) OVER () > 2 THEN integer_value::text||' and more'
        ELSE integer_value::text
    END AS altered_integer,
    text_value
-- To test you can change the condition. When lower than 3, it shows just the value,
-- if you change the query and set lower than 4, the column will have 'and more'.
FROM instituciones WHERE id<3
--FROM instituciones WHERE id<4

查询结果当id&lt; 3:

id | integer_value | altered_integer | text_value
---+---------------+-----------------+------------
1  | 5             | 5               | a
2  | 7             | 7               | b

查询结果当id&lt; 4:

id | integer_value | altered_integer | text_value
---+---------------+-----------------+------------
1  | 5             | 5 and more      | a
2  | 7             | 7 and more      | b
3  | 8             | 8 and more      | c

使用OVER()时,您对COUNT函数说它必须计算整个查询行。

注意:如果查询没有任何条件,OVER()将返回整个表的计数