计算多个月的总销售额

时间:2018-01-10 08:28:46

标签: sql sql-server sum

我想要的输出如下所示。我试图像这样实现它  * new_card_total =总销售额

SELECT DATENAME(MONTH, cl.nc_timestamp) as MonthName, 
       COUNT(*) as new_card_qty,
       ISNULL(sum(cl.nc_deposit),0) as new_card_total
FROM dbfastshosted.dbo.fh_mf_new_card_logs cl  
       INNER JOIN dbfastshosted.dbo.fh_sales_map m 
       on cl.nc_log_id = m.nc_log_id  
       INNER JOIN dbfastshosted.dbo.fh_sales_logs sl 
       on m.sales_id = sl.sales_id 
       INNER JOIN dbfastsconfigdataref.dbo.cdf_terminal_user_account h 
       on cl.created_user_id = h.terminal_user_id  
       INNER JOIN dbfastsconfigdataref.dbo.cdf_terminal t 
       on h.terminal_id = t.terminal_id  
       INNER JOIN dbfastsconfigdataref.dbo.cdf_cuid c 
       on cl.cu_id = c.cu_id  
       INNER JOIN dbfastsconfigdataref.dbo.cdf_card_role cr 
       on cr.id = c.card_role_id 
       INNER JOIN dbfastshosted.dbo.fh_mf_top_up_logs tl 
       on tl.tu_log_id = m.tu_log_id 
WHERE YEAR(cl.nc_timestamp)= 2017   
and cl.currency_id = 1
and (cr_log_id is null or cr_log_id = 0)
and top_up_status = 1
GROUP BY DATENAME(MONTH,cl.nc_timestamp), DATEPART(MONTH, cl.nc_timestamp)

union all

SELECT DATENAME(MONTH, cl.nc_timestamp) as MonthName, 
       COUNT(*) as new_card_qty, 
       ISNULL(sum(cl.nc_deposit),0) as new_card_total
FROM dbfastshosted.dbo.fh_mf_new_card_logs cl  
     INNER JOIN dbfastshosted.dbo.fh_sales_map m 
     on cl.nc_log_id = m.nc_log_id  
     INNER JOIN dbfastshosted.dbo.fh_sales_logs sl 
     on m.sales_id = sl.sales_id 
     INNER JOIN dbfastsconfigdataref.dbo.cdf_terminal_user_account h 
     on cl.created_user_id = h.terminal_user_id  
     INNER JOIN dbfastsconfigdataref.dbo.cdf_terminal t 
     on h.terminal_id = t.terminal_id  
     INNER JOIN dbfastsconfigdataref.dbo.cdf_cuid c 
     on cl.cu_id = c.cu_id  
     INNER JOIN dbfastsconfigdataref.dbo.cdf_card_role cr 
     on cr.id = c.card_role_id 
     INNER JOIN dbfastshosted.dbo.fh_trans tr 
     on tr.trans_id = m.trans_id 
WHERE YEAR(cl.nc_timestamp)= 2017   
and cl.currency_id = 1
and (cr_log_id is null or cr_log_id = 0)
GROUP BY DATENAME(MONTH,cl.nc_timestamp), DATEPART(MONTH, cl.nc_timestamp)

带输出:

 monthname        new_card_qty          new_card_value
 -----------------------------------------------------------
  jan                 100                   1000
  feb                 200                   2000
  march               300                   3000
  march               400                   5000
  april               500                   6000
  april               500                   8000

我希望输出如下:

 monthname        new_card_qty          new_card_total
 -----------------------------------------------------------
  jan                 100                   1000
  feb                 200                   2000
  march               700                   8000
  april               1000                  13000

我尝试了很多方法,但无法做到。你能看一下吗?我真的需要帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

可以通过Subquery和group来实现,如下所示:

SELECT MonthName, SUM(new_card_qty), SUM(new_card_value)
FROM 
(SELECT DATENAME(MONTH, cl.nc_timestamp) as MonthName, COUNT(*) as new_card_qty, ISNULL(sum(cl.nc_deposit),0) as new_card_total
FROM dbfastshosted.dbo.fh_mf_new_card_logs cl  ........
union all

SELECT DATENAME(MONTH, cl.nc_timestamp) as MonthName, COUNT(*) as new_card_qty, ISNULL(sum(cl.nc_deposit),0) as new_card_total 
FROM dbfastshosted.dbo.fh_mf_new_card_logs cl ......) AS A
GROUP BY MonthName