2011-07-07 124 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