【问题标题】:Use sum case sql in Crystal command to show sales in this year and last year?Crystal命令中使用sum case sql显示今年和去年的销售额?
【发布时间】:2014-07-09 19:17:41
【问题描述】:

我在 Crystal“命令”中使用下面的 sql 代码来显示当前年份的销售单位和美元(所有关闭的销售额与使用折扣关闭的销售额)。我需要添加过去几年的单位销售数量。有谁知道这样做的嵌套方式?感谢任何有想法的人。

代码:

SELECT

convert(char(4),datepart(yy,m.close_dt)) +
       right('00' +   convert(varchar,datepart(m,m.close_dt)),2) AS SortMonth,

replace(right(convert(varchar(11), m.close_dt, 106), 8), ' ', '-') AS DisplayMonth,
sum(case when lt.um_ch177= 'BAWRM' then 1 else 0 end) as Close_Units_Disc ,
sum(case when lt.um_ch177= 'BAWRM' then m.tot_ln_amt else 0 end) as Close_Dollars_Disc,

sum(case when m.close_dt >= '{?Date1}'
    and m.close_dt <= '{?Date2}' then 1 else 0 end) as Close_Units_All,
sum(case when m.close_dt >= '{?Date1}'
    and m.close_dt <= '{?Date2}' then tot_ln_amt else 0 end) as Close_Dollars_All

FROM
pro2sql.lt_master m WITH (NOLOCK)
LEFT OUTER JOIN pro2sql.ltuch_master lt WITH (NOLOCK) ON m.lt_acnt=lt.lt_acnt

WHERE
m.stage = 60
and m.loan_purpose <> 7 
and m.app_number <> 0
and m.brch_entry {?BranchList}



and m.close_dt >= '{?Date1}'
and m.close_dt <'{?Date2}'

Group by

convert(char(4),datepart(yy,m.close_dt)) + right('00' +   convert(varchar,datepart(m,m.close_dt)),2) 
,replace(right(convert(varchar(11), m.close_dt, 106), 8), ' ', '-') 

我无法上传图片 - 不确定这是否会变得混乱,但这是输出 - 最后两列是我需要添加的:

DisplayMonth  Close_Units_Disc  Close_Dollars_Disc  Close_Units_All  Close_Dollars_All  %Units  %Dollars  DisplayMonth  LY CloseUnits All
Feb-2014            115             $48,919,800        190         $83,942,650         61%       58%     Feb-2013   
Mar-2014            202             $91,077,780        238         $109,300,903    85%       83%     Mar-2013   
Apr-2014            219             $89,157,481        238         $95,892,509         92%       93%     Apr-2013   

【问题讨论】:

  • {?Date1} 或 {?Date1} 是否始终为当前年份日期?你的数据库是什么?
  • 我们的财政年度是 11 月 1 日 - 10 月 31 日 - 所以日期 1 = 2013 年 1 月 1 日,日期 2 实际上是每个月的最后一天,因为它是月度报告。数据正在从我们的企业系统中提取。谢谢。

标签: sql crystal-reports command multiple-columns


【解决方案1】:

“企业系统”不是一个充分的答案。这是什么类型的数据库?甲骨文?微软(如果它的 MSS 是哪个版本)?还有什么?

这可能会影响可能的解决方案,或者至少影响语法

不过,你至少有两个选择:

一个:

  • 扩大日期范围以提取上一年的数据;
  • 修改您的所有sum case 语句以仅包括当前年份。
  • 添加一个额外的sum case,并为上一年的单位添加适当的日期范围条件。

两个:

  • 将您的查询复制为上一年的子查询并加入它

例如:

LEFT OUTER JOIN (
replace(right(convert(varchar(11), m.close_dt, 106), 8), ' ', '-') AS DisplayMonth,
SELECT sum(case when lt.um_ch177= 'BAWRM' then 1 else 0 end) as Close_Units_Disc 
FROM pro2sql.lt_master m WITH (NOLOCK)

LEFT OUTER JOIN pro2sql.ltuch_master lt WITH (NOLOCK) ON m.lt_acnt=lt.lt_acnt

WHERE m.stage = 60 and m.loan_purpose <> 7 and m.app_number <> 0
      and m.brch_entry {?BranchList}
      and m.close_dt >= '{?Date3}'   --//#last year's start date
      and m.close_dt <'{?Date4}'`    --//#last year's end date

Group by
  convert(char(4),datepart(yy,m.close_dt)) + 
          right('00' + convert(varchar,datepart(m,m.close_dt)),2),
  replace(right(convert(varchar(11), m.close_dt, 106), 8), ' ', '-') 
) as lastYear
on replace(right(convert(varchar(11), m.close_dt, 106), 8), ' ', '-') = lastYear.DisplayMonth

如果您选择其中一种方法,您可能需要咨询贵公司的 DBA,看看哪种方法更有效...我不知道运行具有更大结果的查询是否比运行更密集两次几乎相同的查询,这也可能从一种架构更改为另一种架构(甚至只是在服务器上配置了不同的环境变量/参数)

【讨论】:

    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多