2015-01-14 4 views
0

Я строю курьерскую систему, использующую Codeigniter и Mysql для небольшой курьерской компании. Я пытаюсь создать сводную таблицу, в которой будут показаны общие платежи, сделанные для определенного типа оплаты для каждой накладной, включая Grand Total.SQL Pivot Table с дополнительной колонкой

У меня есть этот запрос сейчас:

SELECT IFNULL(p.waybill_number, 'GrandTotal') AS Waybill, w.consignee, w.consignor, 
     SUM(IF(  p.payment_terms = 'prepaid', p.amount, NULL)) AS Prepaid, 
     SUM(IF(p.payment_terms = 'collect', p.amount, NULL)) AS Collect 
FROM payment p JOIN 
    waybill w 
    ON p.waybill_number = w.waybill_number 
GROUP BY p.waybill_number WITH ROLLUP 

, но это показывает значения для грузополучателя и грузоотправителя в последней строке. я хочу показать ТОЛЬКО GrandTotal для всех транзакций «PREPAID» и «COLLECT» в последней строке. Я надеюсь, что вы можете помочь.

Заранее благодарен!

UPDATE ::: Я редактировал мой запрос, и это выглядит, как это сейчас ...

SELECT 
IFNULL(mw.waybill_number, 'GrandTotal') as Waybill, 
CASE WHEN mw.waybill_number THEN c1.name ELSE NULL END as Consignee, 
CASE WHEN mw.waybill_number THEN c2.name ELSE NULL END as Consignee, 
SUM(IF(p.payment_terms = 'prepaid', p.amount, NULL)) as Prepaid, 
SUM(IF(p.payment_terms = 'collect', p.amount, NULL)) as Collect 
FROM manifest_waybill mw 
JOIN waybill w 
on w.waybill_number = mw.waybill_number 
LEFT JOIN payment p 
on p.waybill_number = mw.waybill_number 
JOIN customer c1 
on c1.customer_id = w.consignee 
JOIN customer c2 
on c2.customer_id = w.consignor 
WHERE manifest_number = 103 
GROUP BY mw.waybill_number WITH ROLLUP 

прогоны запроса, но результат не то, что я ожидал. этот запрос повторяет значение для грузополучателя и грузоотправителя в каждой строке.

я хочу, чтобы результат как это:

накладной # | грузополучатель | грузоотправитель |

1216415 | A | B |

1216416 | C | D |

1216417 | E | F |

что случается:

накладная # | грузополучатель | грузоотправитель |

1216415 | E | F |

1216416 | E | F |

1216417 | E | F |

значение последней строки (121617) получает повторяется в каждой строке

ответ

0

Если я правильно понимаю, просто использовать case заявление:

SELECT IFNULL(p.waybill_number, 'GrandTotal') AS Waybill, 
     (CASE WHEN p.waybill_number IS NOT NULL THEN w.consignee END) as consignee, 
     (CASE WHEN p.waybill_number IS NOT NULL THEN w.consignor END) as consignor, 
     SUM(IF(p.payment_terms = 'prepaid', p.amount, NULL)) AS Prepaid, 
     SUM(IF(p.payment_terms = 'collect', p.amount, NULL)) AS Collect 
FROM payment p JOIN 
    waybill w 
    ON p.waybill_number = w.waybill_number 
GROUP BY p.waybill_number WITH ROLLUP; 
+0

Wow Я действительно удивлен, как быстро ваш ответ был. И это просто отлично! Миллион благодаря вам! –

+0

Сэр Гордон, не могли бы вы объяснить, что происходит с вашим запросом? Я пытаюсь понять, что он делает, но я в замешательстве. Он работает отлично, но я хочу узнать, что не так с моим запросом, и почему ваш запрос был прав, поэтому я знаю, что делать в следующий раз. Благодаря! –

+0

Выражение 'p.waybill_number is not null 'проверяет, является ли строка дополнительной строкой, добавленной' rollup'. Если это так, то вместо «другого» значение помещается в «NULL». –

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