【问题标题】:Simplifying SQL SELECT statements?简化 SQL SELECT 语句?
【发布时间】:2014-10-02 08:07:24
【问题描述】:

我有一个查询,它会提取 36 个月的滚动单位销售历史记录。它按原样工作,但我想知道是否有办法让它变得不那么冗长和繁琐。

查询有两部分 - 标题和数据。

这是我的标题:

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

截至今天,这是 2011 年 9 月 - 11 月。它继续...

, DATEADD(m, -03, GETDATE()-day(GETDATE()-1)) AS  "MM03"
, DATEADD(m, -02, GETDATE()-day(GETDATE()-1)) AS  "MM02"
, DATEADD(m, -01, GETDATE()-day(GETDATE()-1)) AS  "MM01"

2014 年 6 月 - 8 月。36 行代码。

拉取销量数据的语句如下:

, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -36, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -35, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty"  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"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty35"
 , SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -34, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -33, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty34"

截至今天,这是 2011 年 9 月 - 11 月。它继续...

 , SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -03, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -02, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty03"
 , SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -02, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -01, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" 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"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty01"

2014 年 6 月 - 8 月。

在完成这份报告之前,我还有很多东西要补充,所以我希望尽可能保持整洁。

谢谢,

编辑

下面的示例表明,通过上面的代码,我能够得到我想要的(没有代表发布图像,所以我必须做一个链接)。它还表明,使用数据透视表我缺少我的项目编号和滚动月份。我如何添加这两个东西?

Example

我尝试如下删除“ItemTable”.“ItemNum”字段,但它没有显示在我的 Crystal Report 中。在我尝试将它放在其他任何地方时,都会出现“无法绑定”错误。

select 
[0] MM00
, [1] MM01
, [2] MM02
, ...
from (
select 
  "ItemTable"."ItemNum",DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago
, "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty
from your_table
) as source
pivot 
(
 sum(NetQty) For months_ago in ([0], [1], [2], [3], ...)
) as PivotTable

再次感谢。

【问题讨论】:

  • 进行一个月的查询并将其包装在从 1 到 36 递增的 WHILE 循环中。

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


【解决方案1】:

Pivot table 的情况似乎已经成熟。

类似的东西

select 
    [0] MM00
  , [1] MM01
  , [2] MM02
  , ...
from (
  select 
      DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty
  from your_table
) as source
pivot 
(
  sum(NetQty) For months_ago in ([0], [1], [2], [3], ...)
) as PivotTable

编辑

优化示例:包括项目编号相当简单;只需将其包含在 select 语句中即可。

select 
    "ItemTable"."ItemNum"
  , [0] MM00
  , [1] MM01
  , [2] MM02
  , ...
from (
  select
      "ItemTable"."ItemNum" 
    , DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty
  from your_table
) as source
pivot 
(
  sum(NetQty) For months_ago in ([0], [1], [2], [3], ...)
) as PivotTable

为数据透视列设置动态名称相当困难。一般的想法是您必须将 SQL 构建为字符串并动态执行它。 Google 搜索会产生许多结果(例如a SQL Hints blog)。一些不完整的代码可以给你大致的想法。

SET @DynamicPivotQuery = 
 N'select 
    "ItemTable"."ItemNum"
  , [' + @Name1 + ']
  , [' + @Name2 + ']
  , [' + @NameN + ']
from (
  select
      "ItemTable"."ItemNum" 
      /* search MSDN for the best date formatting algorithm */
    , CONVERT_TO_STRING("SalesTable"."SalesDate") month 
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty
  from your_table
) as source
pivot 
(
  sum(NetQty) For month in (
      [' + @Name1 + ']
    , [' + @Name2 + ']
    , [' + @NameN + ']
  )
) as PivotTable';

--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

【讨论】:

  • 感谢您的反馈。像这样的东西肯定更有效。请参阅上面的编辑,我可以在其中阐述我到目前为止所获得的内容。
  • 太棒了。让 ItemNum 显示出来。我唯一需要做的就是将表名(“ItemTable”。)放在第一个 SELECT 运算符下面。不确定那里的基本原理,但它有效。我将不得不玩弄动态名称,看看我是否可以让它工作。不过,你帮助我取得了进步,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2023-03-07
  • 1970-01-01
  • 2019-01-08
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多