Похоже, проблема в том, что нет записи для каждой комбинации месяца и города.Теперь все в порядке, если каждый город имеет продажи каждый месяц, но мы можем улучшить этот код, чтобы он правильно обрабатывал «пропущенные» записи.
Некоторые базы данных имеют специальный синтаксис, который поможет вам составить таблицунапример: Access имеет TRANSFORM
, сервер Oracle и SQL имеет CUBE
и ROLLUP
, MySQL имеет WITH ROLLUP
.Однако вам, возможно, все же придется настроить свой CF даже после корректировки запроса, поэтому давайте попробуем поработать с тем, что у вас есть, в более общей форме.
Вместо внутреннего соединения нам нужно внешнее соединение: все городаплюс продажи для любого города, в котором есть продажи.Однако нам тоже нужны все месяцы.В данном конкретном случае мы можем использовать декартово произведение, чтобы получить месяцы и города.(Будьте очень осторожны с этим: вы должны использовать их только в ситуациях, когда вам действительно нужна одна запись для каждой комбинации поля A и поля B. Легко использовать одну запись в неправильном месте и получить 10000 записей вместо 100).
Давайте возьмем предложение Йохана и изменим его немного:
SELECT SUM(COALESCE(NETTOTAL,0)) NETTOTAL
,SC.CITY_ID
,SC.CITY_NAME
,M.INVOICE_MONTH
FROM SETUP_CITY SC
LEFT OUTER JOIN COMPANY C ON SC.CITY_ID = C.CITY
LEFT OUTER JOIN #DSN2_ALIAS#.INVOICE I ON C.COMPANY_ID = I.COMPANY_ID
, (SELECT DISTINCT DATEPART(MM,INVOICE_DATE) INVOICE_MONTH FROM #DSN2_ALIAS#.INVOICE) M
WHERE PURCHASE_SALES = 1
AND DATEPART(MM,I.INVOICE_DATE) = M.INVOICE_MONTH
GROUP BY SC.CITY_ID, SC.CITY_NAME, M.INVOICE_MONTH
ORDER BY SC.CITY_NAME, M.INVOICE_MONTH
Я немного нечеткий формат для декартового произведения с другими присутствующими внутренними объединениями, поэтому давайтеэто попытка, и мы можем изменить ее по мере необходимости.
Это должно дать вам запрос со значением для каждого города за каждый месяц с продажами.Точная форма внешнего объединения может потребоваться изменить в зависимости от базы данных, которую вы используете, но это должно, по крайней мере, привести вас в правильном направлении.
Обратите внимание, что вам нужно будет изменить свой CF, чтобы он соответствовал пересмотренному запросу, но я думаю, что только эта часть:
<cfoutput query="GET_SALES_TOTAL" group="AY"><!--- months first --->
<tr class="color-row"><!--- month-specific stuff goes here --->
<td>#ay#</td>
становится
<cfoutput query="GET_SALES_TOTAL" group="INVOICE_MONTH"><!--- months first --->
<tr class="color-row"><!--- month-specific stuff goes here --->
<td>#invoice_month#</td>