2011-07-07 177 views
0

作爲I was advised by a good man and programmer我應該簡化我的表。到目前爲止,我已經創建了一個新表格(x-month,y-cities,value-Nettotal),但我仍不明白爲什麼它不能將城市的值(淨值)分組。這個月沒關係,但值只是從左到右從左到右,沒有任何遺漏。無論如何,我希望你會明白一切從來源:通過城市

這裏查詢:

<cfquery name="GET_SALES_TOTAL" datasource="#dsn#"> 
SELECT 
    SUM(COALESCE(nettotal,0)) nettotal, 
    SC.CITY_ID, 
    DATEPART(MM,INVOICE_DATE) AY, 
    C.FULLNAME, 
    SC.CITY_NAME 
FROM  
    #DSN2_ALIAS#.INVOICE I, 
    SETUP_CITY SC, 
    COMPANY C 
WHERE 
    C.COMPANY_ID=I.COMPANY_ID 
    AND SC.CITY_ID=C.CITY 
    AND PURCHASE_SALES=1 
GROUP BY 
    DATEPART(MM,INVOICE_DATE), 
    SC.CITY_ID, 
    C.FULLNAME, 
    SC.CITY_NAME 
ORDER BY 
     AY,CITY_ID 
</cfquery> 

<cfquery name="GET_SALES_GRAND_TOTAL" datasource="#dsn#"> 
SELECT SUM(NETTOTAL) NETTOTAL,SC.CITY_ID,SC.CITY_NAME 
FROM #DSN2_ALIAS#.INVOICE I,SETUP_CITY SC,COMPANY C 
WHERE C.COMPANY_ID=I.COMPANY_ID AND SC.CITY_ID=C.CITY AND PURCHASE_SALES=1 
GROUP BY SC.CITY_ID, SC.CITY_NAME 
ORDER BY CITY_ID,CITY_NAME 
</cfquery> 

,這裏是表本身:

<table cellpadding="3" cellspacing="1" class="color-border"> 
<tr class="color-header"> 
    <td></td> 
    <cfoutput query="GET_SALES_GRAND_TOTAL" group="city_id"> 
     <td>#city_name#</td> 
    </cfoutput> 
</tr> 
<cfoutput query="GET_SALES_TOTAL" group="AY"><!--- months first ---> 
    <tr class="color-row"><!--- month-specific stuff goes here ---> 
     <td>#ay#</td> 
     <cfoutput group="city_id"><!--- city-specific stuff ---> 
      <td>#tlformat(nettotal,2)#<!--- format NETTOTAL however you want here ---></td> 
     </cfoutput> 
    </tr> 
</cfoutput> 
<tr class="color-header"> 
    <td>City Overal</td> 
    <cfoutput query="GET_SALES_GRAND_TOTAL" group="city_id"> 
     <td>#tlformat(nettotal,2)#<!--- format NETTOTAL here ---></td> 
    </cfoutput> 
</tr> 
</table> 

下面是截圖,以使其更清晰:

screenshot

其他的東西除了分組城市完美!

+0

截圖真正幫助:這是要容易得多當我們能夠看到你想要做什麼以及你的結果是什麼時,回答問題。 –

+0

@Dave,希望現在或多或少清楚))btw截圖1,2,3,4,5,6,7是數字:)但沒有命名em但 – user775917

回答

2

它看起來像你遇到的是沒有爲一個月和城市的每一個組合記錄的問題。如果每個城市每個月都有銷售額,現在的設置很好,但是我們可以改進此代碼,以便它能夠正確處理「缺失」條目。

有些數據庫具有特定的語法,這將有助於你做出一個表是這樣的:例如,Access有TRANSFORM,Oracle和SQL Server有CUBEROLLUP,MySQL有WITH ROLLUP。但是,即使在調整查詢之後,您仍然可能需要調整CF,所以讓我們嘗試以更一般的形式處理您的CF。

而不是內部聯接,我們想要一個外部聯接:所有城市加銷售任何有銷售的城市。但是,我們還需要所有的月份。在這個特定的例子中,我們可以使用笛卡爾產品來獲得月份和城市。 (對這些要非常小心:只有在確實需要A場和B場的每個組合的記錄的情況下才能使用它們。在錯誤的地方使用一個記錄很容易,並且可以獲得10,000條記錄而不是100條記錄。)

讓我們Johan's suggestion並修改它的一些:

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> 
+0

但是在你的代碼中沒有提到'DATEPART(MM,INVOICE_DATE)AY' ?!這意味着我必須改變桌子的結構嗎?! – user775917

+0

即使我在代碼中添加了invoice_date,結果就像每個值都顯示在一列 – user775917

+0

@user,沒錯,我們確實需要這樣做...堅持,我會把它放回去,這就是棘手的部分。我們需要爲每個月強制輸入,但幾個月目前是INVOICE表的一部分。我知道該怎麼做,但需要一分鐘才能解決。 –

0

SUM具有評估爲null的煩人特徵是總和值之一爲空。

嘗試改變SELECT SUM(NETTOTAL) NETTOTALSELECT SUM(COALESCE(nettotal,0)) nettotal

備註上查詢語法

請不要使用隱where加入他們是混亂的,容易出錯,不利於你的心理健康。
使用明確連接代替:

SELECT SUM(NETTOTAL) NETTOTAL 
    ,SC.CITY_ID 
    ,SC.CITY_NAME      
FROM #DSN2_ALIAS#.INVOICE I 
    INNER JOIN SETUP_CITY SC ON SC.CITY_ID = C.CITY 
    INNER JOIN COMPANY C ON C.COMPANY_ID = I.COMPANY_ID     
WHERE PURCHASE_SALES = 1      
GROUP BY SC.CITY_ID, SC.CITY_NAME      
ORDER BY SC.CITY_NAME 

這種方式可以分開從過濾條件加入條件和您的查詢會更易於維護,如果你需要加入大量的表格的擴大。
作爲獎勵,您將從SQL '89中脫身,因此您最終可以離開Loveshack

+0

抱歉說'SELECT SUM(COALESCE(nettotal,0))nettotal' does not help ... – user775917

0

在ColdFusion中,當使用分組的cfoutput時,無論您分組在哪個列上,都應該位於查詢的ORDER BY部分。因此,改變先查詢有ORDER BY AY, city_id 並更改第二個查詢有ORDER BY SC.CITY_NAME, city_id

+0

nope,仍然沒有空閒空間... – user775917