使用SQL /命令从头开始构建Crystal Report

时间:2014-09-11 16:02:06

标签: sql sql-server crystal-reports crystal-reports-xi

我正在尝试使用命令从头开始创建滚动单位销售历史报告(反过来,它将用于预测销售)。我决定不能通过常规手段建立这个,因为只会有太多的公式。

我已成功拉动单位销售并为该字段创建标题,指定数据是2011年9月(36个月前)。这是我的SQL:

SELECT "SalesTable"."UnitSalesQty" - "SalesTable"."UnitReturnQty" AS "NetQty36"
        , DATEADD(m, -36, GETDATE() - day(GETDATE() - 1)) AS "M36"
        , "ItemTable"."ItemNum" 
    FROM "ERP_app"."dbo"."SalesTable" "SalesTable" 
        INNER JOIN "ERP_app"."dbo"."ItemTable" "ItemTable" 
            ON "ItemTable"."ItemKey"="SalesTable"."ItemKey" 
    WHERE "SalesTable"."SalesDate" 
            BETWEEN DATEADD(m, -36, GETDATE() - day(GETDATE() - 1)) 
                AND DATEADD(m, -35, GETDATE() - day(GETDATE() - 1)) - 1 
        AND "ItemNum" = '1000' 

为了简单起见,我现在只选择一个项目。

我的问题是,当我想添加2011年10月时,我不知道是添加到此命令还是创建新命令。我试过了两个。当我添加到此命令时,我收到错误消息,因为带有日期参数的语法是错误的。当我尝试创建一个新命令,将“36”更改为“35”并将数据添加到报告中时,我的2011年9月总计(使用上述命令正确)结果太高。

我是一个会计/财务人员,所以请原谅我的任何无知。

编辑:

根据请求,here(我没有发布图片的代表)是带有上述代码的屏幕截图。详细信息代表每个销售订单。总和是正确的 - 这个月有315个单位。我想在右侧(10月11日,11月11日,7月14日,8月13日)添加更多列,以及各自的单位销售总额。

编辑2:

我能够从别人的问题中解决问题。这是它的要点:

SELECT  DATEADD(m, -36, GETDATE()-day(GETDATE()-1)) AS  "MM36"
 , DATEADD(m, -35, GETDATE()-day(GETDATE()-1)) AS  "MM35"

...

 , DATEADD(m, -02, GETDATE()-day(GETDATE()-1)) AS  "MM02"
 , DATEADD(m, -01, GETDATE()-day(GETDATE()-1)) AS  "MM01"
 , "timItem"."ItemID"
 , SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -36, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -35, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."UnitSalesQty" - "SalesTable"."UnitReturnQty"  ELSE NULL END) AS "NetQty36"
 , SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -35, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -34, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."UnitSalesQty" - "SalesTable"."UnitReturnQty" ELSE NULL END) AS "NetQty35"

...

 , SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -02, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -01, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."UnitSalesQty" - "SalesTable"."UnitReturnQty" ELSE NULL END) AS "NetQty02"
 , SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -01, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -00, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."UnitSalesQty" - "SalesTable"."UnitReturnQty" ELSE NULL END) AS "NetQty01"

FROM "ERP_app"."dbo"."SalesTable" "SalesTable"
 INNER JOIN "ERP_app"."dbo"."ItemTable" "ItemTable" 
     ON "ItemTable"."ItemKey"="SalesTable"."ItemKey"

WHERE "ItemNum" = '1000'

GROUP BY "ItemNum"

1 个答案:

答案 0 :(得分:0)

也许试试这个?那你就不必试着找到这个月的最后一天......

   SELECT "SalesTable"."UnitSalesQty" - "SalesTable"."UnitReturnQty" AS "NetQty36"
            , DATEADD(m, -36, GETDATE() - day(GETDATE() - 1)) AS "M36"
            , "ItemTable"."ItemNum" 
        FROM "ERP_app"."dbo"."SalesTable" "SalesTable" 
            INNER JOIN "ERP_app"."dbo"."ItemTable" "ItemTable" 
                ON "ItemTable"."ItemKey"="SalesTable"."ItemKey" 
        WHERE MONTH("SalesTable"."SalesDate")
                BETWEEN MONTH(DATEADD(m, -36, GETDATE())) 
                    AND MONTH(DATEADD(m, -35, GETDATE()))
          AND YEAR("SalesTable"."SalesDate") = YEAR(DATEADD(yy,-2,GETDATE()))
            AND "ItemNum" = '1000'