2013-04-27 2 views
2

Создание ежемесячного сводного отчета о продажах для разных продуктов. Зейн Bien пост здесь очень полезно при создании запроса для получения одной строки для одного продукта:mysql crosstab с столбцами месяца и несколькими строками поля

Income Source Jan Feb Mar -- Total Pct 
Report Fees 11285 12745 17980 ... 236970 95.9954 

Вот этот запрос:

SELECT "Report Fees" AS `Income Source`, 
SUM(IF(MONTH(b.ord_billed_time) =1, b.ord_fee_report, 0)) AS Jan, 
SUM(IF(MONTH(b.ord_billed_time) =2, b.ord_fee_report, 0)) AS Feb, 
SUM(IF(MONTH(b.ord_billed_time) =3, b.ord_fee_report, 0)) AS Mar, 
"..." AS `--` , 
SUM(b.ord_fee_report) AS Total, 
AVG(b.ord_fee_report/b.ord_fee_total) *100 AS Pct 
FROM orders b 
WHERE b.ord_billed_time IS NOT NULL 
AND b.ord_cancelled_time IS NULL 
AND b.ord_fee_report IS NOT NULL 
AND year(b.ord_billed_time) = 2012 
AND b.clientID = 8 

Есть ли способ, чтобы расширить этот единственный запрос, так что я получаю 8 строк, по одному для каждого типа дохода и «общая сумма»? Что-то вроде этого:

Income Source Jan Feb Mar -- Total Pct 
Report Fees 11285 12745 17980 ... 236970 95.9954 
Income Type2 5401 3320 1394 ... 13456 0.321 
Income Type3  98 421 14 ... 1102 0.001 
... 
Total   333333 22222 11111 ... 9999999 100.0 

доход типы хранятся в таблице заказов в отдельных колонках: ord_fee_x, ord_fee_y, ord_fee_z и т.д.

Сейчас я бегу 8 запросов и результатов загрузки в массив , затем отобразится из этого массива. Просто кажется, что эффективнее получать данные за один раз и отображать строку за строкой, как было возвращено.

Есть ли способ сделать это?

ответ

0

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

Другими словами:

(SELECT "Report Fees" AS `Income Source`, 
SUM(IF(MONTH(b.ord_billed_time) =1, b.ord_fee_report, 0)) AS Jan, 
SUM(IF(MONTH(b.ord_billed_time) =2, b.ord_fee_report, 0)) AS Feb, 
SUM(IF(MONTH(b.ord_billed_time) =3, b.ord_fee_report, 0)) AS Mar, 
"..." AS `--` , 
SUM(b.ord_fee_report) AS Total, 
AVG(b.ord_fee_report/b.ord_fee_total) *100 AS Pct 
FROM orders b 
WHERE b.ord_billed_time IS NOT NULL 
AND b.ord_cancelled_time IS NULL 
AND b.ord_fee_report IS NOT NULL 
AND year(b.ord_billed_time) = 2012 
AND b.clientID = 8) 
UNION ALL 
(... query 2 ...) 
UNION ALL 
(... query 3 ...) 

и так далее.

Ссылка: http://dev.mysql.com/doc/refman/5.0/en/union.html

0

Спасибо, Даниил.
Я надеялся на CASE или подобное решение, которое было бы более эффективным с точки зрения кода, но предположим, что это не вариант. Тем не менее, спасите меня, создавая множество массивов. Bruce

+0

Если вы хотите сообщить больше или больше информации, вы должны использовать комментарии - а не ответы. – Damiqib

+0

Damiqib: Извините, новичок на этом сайте. Сделаю это в будущем. – Bruce

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