2013-09-29 3 views
1

Мне нужен такой вывод:MySQL месяц мудрый отчет

Month -->| Pre_Mnth2 | Pre_Mnth1 | current_Month_ Name 
Product A | 3387 | 87985 | 2338 
Product B | 6386 | 67983 | 6374 
Product C | 3880 | 76988 | 9378 

... 

Все необходимые данные только в одной таблице.

Колонка выглядит следующим образом:

id | companycode | merchantcode| pdtname | qty | value | invdate | 

Может кто-нибудь помочь мне с кодом PHP MySQL запросов?

Мой текущий код возвращает данные за текущий месяц только

SELECT `pdtname`, `qty`, `value`, sum(`qty`), sum(`value`) 
FROM `ist` 
WHERE merchantcode = $q AND companycode = $companycode 
    AND MONTH(invdate) = $currentdate[mon] 
GROUP BY `pdtname` 

Здесь переменная $q и $companycode берется из сеанса пользователя.

+0

Вы должны каждый месяц в виде отдельного столбца в результате? – Nikhil

ответ

2

Вы ищете что-то вроде этого?

SELECT pdtname, 
     SUM(CASE WHEN invdate 
      BETWEEN LAST_DAY(CURDATE()) - INTERVAL 3 MONTH + INTERVAL 1 DAY 
       AND LAST_DAY(CURDATE()) - INTERVAL 2 MONTH THEN qty END) qty_2m, 
     SUM(CASE WHEN invdate 
      BETWEEN LAST_DAY(CURDATE()) - INTERVAL 3 MONTH + INTERVAL 1 DAY 
       AND LAST_DAY(CURDATE()) - INTERVAL 2 MONTH THEN value END) value_2m, 
     SUM(CASE WHEN invdate 
      BETWEEN LAST_DAY(CURDATE()) - INTERVAL 2 MONTH + INTERVAL 1 DAY 
       AND LAST_DAY(CURDATE()) - INTERVAL 1 MONTH THEN qty END) qty_1m, 
     SUM(CASE WHEN invdate 
      BETWEEN LAST_DAY(CURDATE()) - INTERVAL 2 MONTH + INTERVAL 1 DAY 
       AND LAST_DAY(CURDATE()) - INTERVAL 1 MONTH THEN value END) value_1m, 
     SUM(CASE WHEN invdate 
      BETWEEN LAST_DAY(CURDATE()) - INTERVAL 1 MONTH + INTERVAL 1 DAY 
       AND LAST_DAY(CURDATE()) THEN qty END) qty_m, 
     SUM(CASE WHEN invdate 
      BETWEEN LAST_DAY(CURDATE()) - INTERVAL 1 MONTH + INTERVAL 1 DAY 
       AND LAST_DAY(CURDATE()) THEN value END) value_m 
    FROM ist 
WHERE invdate BETWEEN LAST_DAY(CURDATE()) - INTERVAL 3 MONTH + INTERVAL 1 DAY 
        AND LAST_DAY(CURDATE()) 
    AND companycode = 1 
    AND merchantcode = 1 
GROUP BY pdtname 

Примечание: Убедитесь, что у вас есть индекс по invdate.

Выход:

 
| PDTNAME | QTY_2M | VALUE_2M | QTY_1M | VALUE_1M | QTY_M | VALUE_M | 
|----------|--------|----------|--------|----------|-------|---------| 
| ProductA |  30 |  3000 |  30 |  3000 | 30 | 3000 | 
| ProductB | 100 |  1000 | 100 |  1000 | 100 | 1000 | 
| ProductC | 320 |  3200 | 320 |  3200 | 320 | 3200 | 

Вот SQLFiddle демо

+0

Извините, peter, я не видел вашего сообщения из-за некоторых личных проблем. Я был вне этой задачи. извините за задержку ответа. – Indra

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