как получить количество и процент, сравнивая две таблицы в mysql

У меня есть две таблицы: прошлогодняя и текущего года.

Мне нужно получить общее количество каждой таблицы, затем сравнить и получить процент от прошлого года, а затем сгруппировать их по идентификатору.

Таблица2012

ID  Cate
1     a
1     b
1     c
2     a
2     b
2     c
3     c
3     e

Таблица2013

ID   Cate
1     a
1     b
2     a
2     b
2     c
3     c
3     e
2     r
2     t
3     d
3     g

Требуемый результат отчета

ID   total2012    total2013    percentage
1       3              2            66%
2       3              5           167%
3       2              4           200%

Заранее спасибо

Джейсон


person user2330204    schedule 29.04.2013    source источник
comment
Зачем нужны отдельные таблицы, а не одна таблица со столбцом year?   -  person eggyal    schedule 29.04.2013
comment
Мы должны использовать таблицу для каждого года, потому что данные повторяются каждый год.   -  person user2330204    schedule 29.04.2013
comment
@eggyal Да, я предлагаю ту же идею, что и твоя. У меня есть ответ на него ниже.   -  person mjb    schedule 29.04.2013


Ответы (2)


Попробуй это:

SELECT a.id,
       a.total2012,
       b.total2013,
       (b.total2013 / a.total2012 * 100) AS percentage
FROM
    (SELECT id, Count(*) AS total2012
     FROM Table2012
     GROUP BY id) a,
    (SELECT id, Count(*) AS total2013
     FROM Table2013
     GROUP BY id) b
WHERE a.id = b.id

Редактировать

Это работает, сначала группируя записи по `id˙ в каждой таблице и подсчитывая сгруппированные строки. После этого он объединяет эти два результата и выбирает их в один набор результатов, одновременно вычисляя процентное соотношение.

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

person Darko Kenda    schedule 29.04.2013
comment
ОШИБКА 1054 (42S22): Неизвестный столбец "a.total2012" в "списке полей" - person user2330204; 29.04.2013
comment
я использую MySql версии 4.01 - person user2330204; 29.04.2013
comment
4.01? вау, это как... 10 лет? - person Darko Kenda; 29.04.2013
comment
Я знаю, но мой провайдер не будет обновляться - person user2330204; 29.04.2013

Этот ответ отредактирован из ответа Карко.

Табличные данные

ID    Cate    Year
1     a       2012
1     b       2012
1     c       2012
2     a       2012
2     b       2012
2     c       2012
3     c       2012
3     e       2012
1     a       2013
1     b       2013
2     a       2013
2     b       2013
2     c       2013
3     c       2013
3     e       2013
2     r       2013
2     t       2013
3     d       2013
3     g       2013

Редактировать **
Этот SQL предоставлен eggyal (см. комментарий ниже)
См. его в >> http://sqlfiddle.com/#!2/a8522/1/0

Это лучший оператор SQL:

SELECT   ID,
         SUM(Year=2012) AS total2012,
         SUM(Year=2013) AS total2013,
         100*SUM(Year=2013)/SUM(Year=2012) AS percentage
FROM     TableData
GROUP BY ID

Конец редактирования **

Ниже приведен исходный оператор SQL в этом ответе, который очень неэффективен. хД

SELECT a.ID,
       a.total2012,
       b.total2013,
       (b.total2013 / a.total2012 * 100) AS 'percentage'
FROM
    (SELECT ID, Count(*) AS total2012
     FROM `TableData` WHERE `Year` = 2012
     GROUP BY ID) a,
    (SELECT ID, Count(*) AS total2013
     FROM `TableData` WHERE `Year` = 2013
     GROUP BY ID) b
WHERE a.ID= b.ID
person mjb    schedule 29.04.2013
comment
С этой схемой можно просто сделать SELECT ID, SUM(Year=2012) AS total2012, SUM(Year=2013) AS total2013, 100*SUM(Year=2013)/SUM(Year=2012) AS percentage FROM TableData GROUP BY ID. См. его на sqlfiddle. - person eggyal; 29.04.2013
comment
@eggyal Привет, твое решение лучше. Моя не такая эффективная. ХД. Я обновил его в ответ. - person mjb; 29.04.2013