Хотите получить всю строку и количество в Postgresql - PullRequest
0 голосов
/ 07 мая 2020

У меня есть такая таблица

|   ids   | name     |  status    |
----------------------------------
|    1    | name1    |   true     |
|    2    | name2    |   true     |
|    3    | name1    |   true     |
|    4    | name4    |   true     |
|    5    | name1    |   false    |
|    6    | name2    |   false    |
|    8    | name1    |   false    |
|    9    | name1    |   true     |
|    10   | name1    |   false    |
|    11   | name1    |   false    |

Я хочу получить строку where (name = name1 or name2) and count всего истинного статуса (например, в таблице total_true_count = 4 [ie. Все строки из них ids ids = 1,2,3,9]) и все ложные состояния (например, в таблице total_false_count = 5 ie. [все строки этих идентификаторов = 5,6,8,10,11]) выбранная строка.

Output will be like this

$output=Array
                (
                    [total_true_count] => 4,
                    [total_false_sms] => 5,
                    [row_data]=>{row1,row2....}
                )

Я пробовал функцию подсчета, но у меня она не работает. может кто-нибудь, пожалуйста, помогите

1 Ответ

1 голос
/ 07 мая 2020

Вы можете использовать array_agg для группировки значений в массиве и использовать FILTER для ограничения значений, передаваемых в COUNT(*):

WITH data(id, name, status) AS (
    VALUES (1, 'name1', TRUE)
         , (2, 'name2', TRUE)
         , (3, 'name1', TRUE)
         , (4, 'name4', TRUE)
         , (5, 'name1', FALSE)
         , (6, 'name2', FALSE)
         , (8, 'name1', FALSE)
         , (9, 'name1', TRUE)
         , (10, 'name1', FALSE)
         , (11, 'name1', FALSE)
)
SELECT array_agg(id) AS row_data -- or array_agg(data.*) if you want all columns
     , COUNT(*) FILTER (WHERE status)     AS total_count_true
     , COUNT(*) FILTER (WHERE NOT status) AS total_count_false
FROM data
WHERE name IN ('name1', 'name2')

возвращает

+---------------------+----------------+-----------------+
|row_data             |total_count_true|total_count_false|
+---------------------+----------------+-----------------+
|{1,2,3,5,6,8,9,10,11}|4               |5                |
+---------------------+----------------+-----------------+

или, используя array_agg(data.*):

+----------------------------------------------+----------------+-----------------+
|row_data                                      |total_count_true|total_count_false|
+----------------------------------------------+----------------+-----------------+
|{"(1,name1,t)","(2,name2,t)",…,"(11,name1,f)"}|4               |5                |
+----------------------------------------------+----------------+-----------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...