2013-07-29 3 views
1

Я пытаюсь создать замечательную пользовательскую таблицу, которая подсчитывает количество строк и организует их, чтобы, если в январе 2013 года было три строки с датой, четыре в марте 2014 года и пять в октябре 2014 таблица будет отображаться как:SQL - создать пользовательскую таблицу с месячными столбцами и годами, основанными на годах

 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
2013 3 0 0 0 0 0 0 0 0 0 0 0 
2014 0 0 4 0 0 0 0 0 0 5 0 0 
+0

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

ответ

0

Я бы рекомендовал использовать вид, а не новую таблицу, таким образом, когда ваши исходные данные изменения вашей новой таблицы не выйдет синхронизации.

Поскольку вы не дали много данных выборки я должен был принять структуру, но вы хотите что-то вроде этого:

CREATE TABLE T (`Date` DATETIME); 
INSERT T (`Date`) 
VALUES 
    ('2013-01-01'), ('2013-01-02'), ('2013-01-03'), 
    ('2014-03-01'), ('2014-03-02'), ('2014-03-03'), 
    ('2014-10-01'), ('2014-10-01'), ('2014-10-01'), 
    ('2014-10-01'), ('2014-10-01'); 

CREATE VIEW V 
AS 
    SELECT YEAR(`Date`) AS `Year`, 
      COUNT(CASE WHEN MONTH(`Date`) = 1 THEN 1 END) AS `Jan`, 
      COUNT(CASE WHEN MONTH(`Date`) = 2 THEN 1 END) AS `Feb`, 
      COUNT(CASE WHEN MONTH(`Date`) = 3 THEN 1 END) AS `Mar`, 
      COUNT(CASE WHEN MONTH(`Date`) = 4 THEN 1 END) AS `Apr`, 
      COUNT(CASE WHEN MONTH(`Date`) = 5 THEN 1 END) AS `May`, 
      COUNT(CASE WHEN MONTH(`Date`) = 6 THEN 1 END) AS `Jun`, 
      COUNT(CASE WHEN MONTH(`Date`) = 7 THEN 1 END) AS `Jul`, 
      COUNT(CASE WHEN MONTH(`Date`) = 8 THEN 1 END) AS `Aug`, 
      COUNT(CASE WHEN MONTH(`Date`) = 9 THEN 1 END) AS `Sep`, 
      COUNT(CASE WHEN MONTH(`Date`) = 10 THEN 1 END) AS `Oct`, 
      COUNT(CASE WHEN MONTH(`Date`) = 11 THEN 1 END) AS `Nov`, 
      COUNT(CASE WHEN MONTH(`Date`) = 12 THEN 1 END) AS `Dec` 
    FROM T 
    GROUP BY YEAR(`Date`); 

Example on SQL Fiddle

+0

Я не уверен, что будут отображаться месяцы с 0 записями. Я бы использовал сумму (случай и т. Д., А затем еще 1 конец), а не счет. –

+0

@DanBracuk Это не имеет значения (проверьте скрипку, она отображается точно так же, как выложено в вопросе), два метода работают точно так же, это просто личные предпочтения. Я лично считаю, что имеет смысл использовать 'COUNT', когда вы хотите использовать' COUNT' и 'SUM', когда хотите SUM. – GarethD

+0

Подробнее о 'COUNT (CASE ...)' vs SUM (CASE ...) 'http://dba.stackexchange.com/q/27558/7257 – GarethD