2012-02-11 49 views
1

我有一个城市sql-server代码行和月作为列,有按月总和,但没有总和由city_id,我的意思是我必须计算所有总和按城市输出里面,这组由city_id,反正这里是SQL代码:组里面的sql代码,而不是在cfoutput

SELECT 
    SC.CITY_ID,SC.CITY_NAME, DATEPART(MM,I.INVOICE_DATE) AS INVOICE_MONTH, 
    JAN=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=1 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    FEB=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=2 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    MAR=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=3 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    APR=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=4 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    MAY=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=5 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    JUN=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=6 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    JUL=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=7 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    AUG=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=8 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    SEP=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=9 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    OCT=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=10 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    NOV=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=11 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
    DEC=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=12 THEN COALESCE(NETTOTAL,0) ELSE 0 END) 
FROM 
    SETUP_CITY SC 
    LEFT OUTER JOIN COMPANY C ON C.CITY = SC.CITY_ID 
    LEFT OUTER JOIN #DSN2_ALIAS#.INVOICE I ON I.COMPANY_ID = C.COMPANY_ID AND I.INVOICE_CAT IN (50,52,53,531,532,56,58,561,54,55,51,63,48) AND I.PURCHASE_SALES = 1 
WHERE SC.COUNTRY_ID=1 
GROUP BY SC.CITY_ID,SC.CITY_NAME,I.INVOICE_DATE 
ORDER BY SC.CITY_ID,SC.CITY_NAME,I.INVOICE_DATE 

输出:

<cfoutput query="get_top_sales_TOTAL" group="CITY_ID">

如果我不通过city_id定义组,有是多行的显示一个城市。如何在SQL代码中对这些值进行分组(总结)?这样我就不必在cfoutput里面使用组声明了?

下面是截图,使其更清晰,这里是有定义的group="city_id"

enter image description here

截图如果我不定义group="city_id"

enter image description here

回答

1

马克是正确的关于invoice_month,这是没有意义的。你的“正确”的SQL应该是

SELECT 
     SC.CITY_ID,SC.CITY_NAME, 
     TOTAL=SUM(COALESCE(NETTOTAL,0)), 
     JAN=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=1 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     FEB=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=2 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     MAR=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=3 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     APR=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=4 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     MAY=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=5 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     JUN=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=6 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     JUL=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=7 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     AUG=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=8 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     SEP=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=9 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     OCT=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=10 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     NOV=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=11 THEN COALESCE(NETTOTAL,0) ELSE 0 END), 
     DEC=SUM(CASE WHEN DATEPART(MM,I.INVOICE_DATE)=12 THEN COALESCE(NETTOTAL,0) ELSE 0 END) 
FROM 
     SETUP_CITY SC 
      LEFT OUTER JOIN COMPANY C ON C.CITY = SC.CITY_ID 
      LEFT OUTER JOIN #DSN2_ALIAS#.INVOICE I ON I.COMPANY_ID = C.COMPANY_ID 
        AND I.INVOICE_CAT IN (50,52,53,531,532,56,58,561,54,55,51,63,48) 
        AND I.PURCHASE_SALES = 1 
WHERE SC.COUNTRY_ID=1 
GROUP BY SC.CITY_ID, SC.CITY_NAME 
ORDER BY SC.CITY_ID,SC.CITY_NAME 
+0

谢谢你,可是,我如何使用这个总? – user745110 2012-02-13 07:59:18

+0

总数是对于一个给定的城市(所有月份/年),如果你不需要它,只要删除它,它应该正常工作,没有?或者只是做一个截图,看看发生了什么。 – 2012-02-13 10:10:39

+0

哦!:)没有注意到你已经删除了invoice_month)它有帮助!谢谢!得到一个正确的答案! ;) – user745110 2012-02-13 10:22:42

0

你的问题是, group by和order by中的“invoice_date”将产生多行。试试这个:

GROUP BY SC.CITY_ID, SC.CITY_NAME, DATEPART(MM,I.INVOICE_DATE) 
ORDER BY SC.CITY_ID, SC.CITY_NAME, INVOICE_MONTH 

不能试穿,所以我不能调试 - 但基本上你的小组中不能有它独立的项目,扩大该行的唯一性(作为“发票日期”将可能会)。祝你好运!

+0

谢谢你,这个实际上没有帮助一点,但并没有解决问题:( – user745110 2012-02-13 07:59:50