#postgresql
#postgresql
Вопрос:
Существует некоторый выбор
SELECT column1,
COUNT(CASE column2 WHEN 'type1' THEN 1 ELSE NULL END) AS Type1Count,
COUNT(CASE column2 WHEN 'type2' THEN 1 ELSE NULL END) AS Type2Count,
COUNT(CASE column2 WHEN 'type3' THEN 1 ELSE NULL END) AS Type3Count
FROM Yourtable
GROUP BY column1
помогите мне, пожалуйста, как я могу добавить column0, значения которого соответствуют column1 в запросе выбора, что-то вроде этого
SELECT column0, column1,
COUNT(CASE column2 WHEN 'type1' THEN 1 ELSE NULL END) AS Type1Count,
COUNT(CASE column2 WHEN 'type2' THEN 1 ELSE NULL END) AS Type2Count,
COUNT(CASE column2 WHEN 'type3' THEN 1 ELSE NULL END) AS Type3Count
FROM Yourtable
GROUP BY column1
но мой вариант не работает…
Комментарии:
1. мне нужен уникальный результат из column1, если я ВЫБРАЛ column0, column1, … ГРУППА ПО column0, column1 результатом этого запроса являются все данные, но мне нужен уникальный column1, как в первом примере.
Ответ №1:
Когда вы выбираете точное значение некоторых столбцов и агрегируете (например COUNT()
, SUM()
) для других, вам нужно указать базе данных, что есть что в GROUP BY
предложении.
Если вы скажете:
GROUP BY column0, column1
Затем для каждой уникальной комбинации column0
и column1
вы получите дополнительную строку результатов с COUNT()
выражениями, вычисляемыми по всем строкам таблицы для этой комбинации.
Если вам нужна только одна строка для каждого отдельного значения column1
, вам нужно вместо этого сообщить базе данных, какое значение column0
вас интересует. Например, вы можете запросить минимальное значение column0
для каждого column1
с помощью этого:
SELECT MIN(column0), column1 ... GROUP BY column1
Что означает:
- Мне нужна одна строка для каждого отдельного значения … (
GROUP BY ...
)- …
column1
(... column1
)
- …
- Для каждой строки покажите мне (
SELECT
):- Минимальное значение
column0
в этой группе - Значение
column1
которого будет одинаковым для всего в этой группе
- Минимальное значение
Комментарии:
1. это почти результат, но теперь я вижу в результате column0, как мне нужно, и не вижу соответствующего column1…
2. я пытаюсь ВЫБРАТЬ MIN(column0), COUNT(CASE column2, КОГДА ‘type1’, ЗАТЕМ 1 ELSE NULL END) КАК Type1Count, COUNT (CASE column2, КОГДА ‘type2’, ЗАТЕМ 1 ELSE NULL END) КАК Type2Count, COUNT (CASE column2, КОГДА ‘type3’, ЗАТЕМ 1 ELSE NULL END) КАК Type3Count ИЗ YourtableГРУППИРОВАТЬ ПО столбцу1
3. ВЫБЕРИТЕ MIN(column0), MIN(column1) — сработало для меня!!!! Если это правильный запрос, это то, что мне нужно! 🙂
4. Ваш
SELECT
список не содержитcolumn1
. Результаты содержат все столбцы, которые вы запрашиваете вSELECT
списке. Я немного отредактировал.5. Вам не нужно
MIN()
обходить то, по чему вы группируете — нет никакого «минимума», потому что у вас есть разные строки для каждого отдельного значения.