Разделить список дат по месяцам SQL

0

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

id|date
1 |2019-01-22
2 |2019-02-13
etc

Я хочу иметь таблицу, которая просто перечисляет ID по месяцам. я имею

SELECT 
        'a'.'sourceID' AS 'Jan 2019'
    FROM
        'all_dates' 'a'
    WHERE
        ((MONTH('a'.'next1') = 1)
            AND (YEAR('a'.'next1') = 2019))

Как один столбец, я хочу 12 столбцов для каждого месяца в 2019 году. Мне не нужен союз (насколько я могу судить). Я не уверен, что я просто ввел неправильный синтаксис для подзапроса или мне нужно использовать соединение или что.

(SELECT 
        'a'.'sourceID'
    FROM
        'all_dates' 'a'
    WHERE
        ((MONTH('a'.'next1') = 1)
            AND (YEAR('a'.'next1') = 2019))) AS 'Jan 2019',
(SELECT 
        'a'.'sourceID'
    FROM
        'all_dates' 'a'
    WHERE
        ((MONTH('a'.'next1') = 2)
            AND (YEAR('a'.'next1') = 2019))) AS 'Feb 2019'

Я получаю ошибку "подзапрос возвращает более 1 строки" с выше. Я на правильном пути и мне просто нужно это почистить, или я должен заняться чем-то другим?

Результат, который я хочу, должен выглядеть следующим образом

|jan-2019|feb-2019
| 1      |2
| 4      |3

и т.п.

  • 0
    Что делать, если есть записи за 3 января, за 2 февраля и 999 за декабрь? Как будет выглядеть вывод?
  • 0
    @SalmanA Если в декабре 999 записей, в декабрьской колонке будет 999 записей, а в jan и feb, я думаю, будет куча нулей. Это проблема?
Показать ещё 2 комментария
Теги:
mysql-workbench

1 ответ

0

Следующий запрос является косвенным, также выход имеет нулевые значения, которые не удовлетворяют условию, попробуйте

SELECT 
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '01') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'jan_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '02') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'feb_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '03') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'mar_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '04') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'apr_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '05') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'may_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '06') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'jun_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '07') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'jul_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '08') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'aug_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '09') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'sep_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '10') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'oct_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '11') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'nov_2019',
    (CASE
        WHEN (SUBSTR('jkk'.'dd', 6, 2) = '12') THEN 'jkk'.'id'
        ELSE NULL
    END) AS 'dec_2019'
FROM
    'tablename';
  • 0
    Это работает, но мне нужно удалить пустые записи. Это устанавливает ноль, когда значение не совпадает с указанным месяцем

Ещё вопросы

Сообщество Overcoder
Наверх
Меню