2012-06-20 1 views
1

Используя MySQL, я рассчитываю на появление нескольких событий (полей) за период времени. Затем я показываю это в столбцах по годам. Мой запрос работает идеально, когда группируется по годам. Теперь я хочу добавить последний столбец, который отображает совокупность лет. Как включить в таблицу столбцов запрос?sql multiple columns плюс сумма каждого столбца

Event 2008 2009 2010 2011 total 
    A  0  2 0  1  3 
    B  1  2 3  0  6 
etc. 

Вот реальный вопрос:

select 
    count(*) as total_docs, 
    YEAR(field_document_date_value) as doc_year, 
    field_document_facility_id_value as facility, 
    IF(count(IF(field_document_type_value ='LIC809',1, NULL)) >0,count(IF(field_document_type_value ='LIC809',1, NULL)),'-') as doc_type_LIC809, 
    IF(count(IF(field_document_type_value ='LIC9099',1, NULL)) >0,count(IF(field_document_type_value ='LIC9099',1, NULL)),'-') as doc_type_LIC9099, 
    IF(count(field_document_f1_value) >0,count(field_document_f1_value),'-') as substantial_compliance, 
    IF(count(field_document_f2_value) >0,count(field_document_f2_value),'-') as deficiencies_sited, 
    IF(count(field_document_f3_value) >0,count(field_document_f3_value),'-') as admin_outcome_809, 
    IF(count(field_document_f4_value) >0,count(field_document_f4_value),'-') as unfounded, 
    IF(count(field_document_f5_value) >0,count(field_document_f5_value),'-') as substantiated, 
    IF(count(field_document_f6_value) >0,count(field_document_f6_value),'-') as inconclusive, 
    IF(count(field_document_f7_value) >0,count(field_document_f7_value),'-') as further_investigation, 
    IF(count(field_document_f8_value) >0,count(field_document_f8_value),'-') as admin_outcome_9099, 
    IF(count(field_document_type_a_value) >0,count(field_document_type_a_value),'-') as penalty_type_a, 
    IF(count(field_document_type_b_value) >0,count(field_document_type_b_value),'-') as penalty_type_b, 
    IF(sum(field_document_civil_penalties_value) >0,CONCAT('$',sum(field_document_civil_penalties_value)),'-') as total_penalties, 
    IF(count(field_document_noncompliance_value) >0,count(field_document_noncompliance_value),'-') as total_noncompliance 

from rcfe_content_type_facility_document 

where YEAR(field_document_date_value) BETWEEN year(NOW()) -9 AND year(NOW()) 
    and field_document_facility_id_value = :facility 

group by doc_year 
+0

Могу ли я увидеть запрос? – odiszapc

+0

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

+0

Вы можете просто отредактировать его в своем вопросе, не волнуйтесь о форматировании - кто-то может помочь вам исправить ситуацию. – nevets1219

ответ

0

Вы не можете GROUP строку дважды в SELECT, так что вы можете рассчитывать только строки в год или в общей сложности. Вы можете UNION два SELECT (один сгруппированный по году, второй не сгруппированный - всего), чтобы преодолеть это ограничение, но я думаю, что лучше всего подсчитать итоговый результат от года в скрипте, если он есть.

Упрощенный пример:

SELECT by_year.amount, years.date_year FROM 

-- generating years pseudo table 
(
    SELECT 2008 AS date_year 
    UNION ALL SELECT 2009 
    UNION ALL SELECT 2010 
    UNION ALL SELECT 2011 
) AS years 

-- joining with yearly stat data 
LEFT JOIN 
(
    SELECT SUM(value_field) AS amount, YEAR(date_field) AS date_year FROM data 
    GROUP BY YEAR(date_field) 
) AS by_year USING(date_year) 

-- appending total 
UNION ALL SELECT SUM(value_field) AS amount, 'total' AS date_year FROM data 
+0

Спасибо - работает UNION. К сожалению, у меня нет доступа к скрипту. Моя другая проблема заключается в том, что в течение нескольких лет нет данных, поэтому они не возвращают никаких значений. Мне нужно выяснить способ показать эти «свободные» годы. Я не могу понять, как это сделать, используя LEFT OUTER JOIN, который должен сделать трюк. –

+0

Добавлен пример с пустыми годами – vearutop

+0

Кроме того, vearutop, спасибо за пояснение, чтобы показать годы, которые не имеют каких-либо значений. Он отлично работал. Ты жжешь!!! –

0

С ROLLUP ваш друг: http://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html

Используйте свой первоначальный запрос, и просто добавьте в последнюю строку:

GROUP BY doc_year WITH ROLLUP 

Это будет добавьте окончательную кумулятивную строку в набор результатов вашего запроса.

Смежные вопросы