Запросите другое состояние с 1 столбцом - PullRequest
0 голосов
/ 16 октября 2018

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

+-------+--------+----------+------------+-------+
| cd_hs | cd_cnt | name_cnt |   dates    | value |
+-------+--------+----------+------------+-------+
|     1 |      1 | aaa      | 2018-06-01 |    50 |
|     1 |      2 | bbb      | 2018-07-01 |   150 |
|     1 |      3 | ccc      | 2018-08-01 |    20 |
|     1 |      1 | aaa      | 2018-06-02 |    40 |
|     1 |      2 | bbb      | 2018-07-02 |    70 |
|     1 |      3 | ccc      | 2018-08-02 |    80 |
+-------+--------+----------+------------+-------+

На самом деле у меня есть больше данных, но я просто показываю образец, и я хочу сделать следующее:

Я хочу сгруппировать по cd_hs, name_cnt и на основе year в столбце dates и выполните sum(value), но у меня есть условие 2.Первый - показать значение с условием cd_cnt with 1 and 2 и вторым условием cd_cnt without 1 and 2, что означает, что у меня много значений, отличных от 1 и 2, и я использую псевдоним как other в одном столбце

Ожидаемый результат:

+-------+------+----------+-------------+
| cd_hs | year | name_cnt | total_value |
+-------+------+----------+-------------+
|     1 | 2018 | aaa      |          90 |
|     1 | 2018 | bbb      |         220 |
|     1 | 2018 | other    |         100 |
+-------+------+----------+-------------+

как я могу это сделать?Я новичок в запросе и не знаю, что делать ..

1 Ответ

0 голосов
/ 16 октября 2018

Ваш вопрос немного сбивает с толку, учитывая, что ваша спецификация не совсем соответствует тому, что вы запрашивали.

Если предоставленный вами пример результата на самом деле то, что вы ищете, простые SUM и GROUP BY должны решить эту проблему:

SELECT cd_hs, EXTRACT(YEAR from dates) as year, name_cnt, SUM(value_)
FROM foo
GROUP BY cd_hs, EXTRACT(YEAR from dates), name_cnt

Результат:

| cd_hs | year | name_cnt | sum |
|-------|------|----------|-----|
|     1 | 2018 |      aaa |  90 |
|     1 | 2018 |      bbb | 220 |
|     1 | 2018 |      ccc | 100 |

SQLFiddle


Поскольку вы упомянули, что хотите получить две разные суммы с двумя отдельными условиями, вы можете использовать JOIN в сочетании с некоторыми хорошо продуманными подзапросами:

SELECT a.cd_hs, EXTRACT(YEAR FROM a.dates), a.name_cnt, COALESCE(b.total_a, 0) as "Total A", COALESCE(c.total_b, 0) as "Total B"
FROM foo a
LEFT JOIN (
  SELECT b.cd_hs, b.name_cnt, EXTRACT(YEAR FROM b.dates), SUM(value_) as total_a
  FROM foo b
  WHERE b.cd_cnt NOT IN (1, 2)
  GROUP BY b.cd_hs, b.name_cnt, EXTRACT(YEAR from b.dates)
) b ON a.cd_hs = b.cd_hs AND a.name_cnt = b.name_cnt
LEFT JOIN (
  SELECT c.cd_hs, c.name_cnt, EXTRACT(YEAR FROM c.dates), SUM(value_) as total_b
  FROM foo c
  WHERE c.cd_cnt IN (1, 2)
  GROUP BY c.cd_hs, c.name_cnt, EXTRACT(YEAR from c.dates)
) c ON a.cd_hs = c.cd_hs AND a.name_cnt = c.name_cnt

Этот конкретныйРешение доступно для чтения и приведет вас к правильному конечному результату, но, скорее всего, не будет масштабируемым в его текущей форме.

Результат:

| cd_hs | date_part | name_cnt | Total A | Total B |
|-------|-----------|----------|---------|---------|
|     1 |      2018 |      aaa |       0 |      90 |
|     1 |      2018 |      bbb |       0 |     220 |
|     1 |      2018 |      ccc |     100 |       0 |
|     1 |      2018 |      aaa |       0 |      90 |
|     1 |      2018 |      bbb |       0 |     220 |
|     1 |      2018 |      ccc |     100 |       0 |

SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...