需要根据日期范围参数包含不同列的报告

Posted

技术标签:

【中文标题】需要根据日期范围参数包含不同列的报告【英文标题】:Need a report with varying columns depending on Date range parameter 【发布时间】:2015-04-27 15:18:47 【问题描述】:

我是 SQL 的新手。我目前正在开发一个 Oracle 数据库,并创建了一个根据日期范围参数提取数据的报告。

代码如下:

SELECT 
  DISTINCT C.CUSTOMER_CODE
, MS.SALESMAN_NAME
, SUM(C.REVENUE_AMT) Rev_Amt


FROM 
    C_REVENUE_ANALYSIS C
  , M_CUSTOMER_H MC
  , M_SALESMAN MS


WHERE C.COMPANY_CODE = 'W1'
  AND C.CUSTOMER_CODE = MC.CUSTOMER_CODE
  AND MC.SALESMAN_CODE = MS.SALESMAN_CODE
  AND trunc(C.REVENUE_DATE) between to_date(<STARTDATE>,'YYYYMMDD') and to_date(<ENDDATE>,'YYYYMMDD')
  AND MS.COMPANY_CODE = '00'

GROUP BY C.CUSTOMER_CODE, MS.SALESMAN_NAME

ORDER BY C.CUSTOMER_CODE, MS.SALESMAN_NAME

1 月 1 日至 4 月 30 日期间生成的报告是:

+-----------+--------------+--------------+
|Customer   |Salesman Name |Revenue Amount|
+-----------+--------------+--------------+
|Customer 1 |Salesman 1    |       5000.00|
+-----------+--------------+--------------+
|Customer 2 |Salesman 1    |       8000.00|
+-----------+--------------+--------------+
|Customer 3 |Salesman 2    |        300.00|
+-----------+--------------+--------------+
|Customer 4 |Salesman 3    |        600.00|
+-----------+--------------+--------------+
|Customer 5 |Salesman 3    |       5000.00|
+-----------+--------------+--------------+
|Customer 6 |Salesman 3    |       8000.00|
+-----------+--------------+--------------+
|Customer 7 |Salesman 4    |       9000.00|
+-----------+--------------+--------------+
|Customer 8 |Salesman 5    |       2000.00|
+-----------+--------------+--------------+
|Customer 9 |Salesman 6    |       1000.00|
+-----------+--------------+--------------+
|Customer10 |Salesman 6    |       5000.00|
+-----------+--------------+--------------+
|Customer11 |Salesman 7    |       6000.00|
+-----------+--------------+--------------+
|Customer12 |Salesman 8    |       8000.00|
+-----------+--------------+--------------+

我需要显示从 1 月到 4 月每个月每个销售员的收入明细。

所以我希望结果如下所示:

+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer   |Salesman Name |Rev for Jan|Rev for Feb|Rev for Mar|Rev for Apr|Total Rev Amt|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 1 |Salesman 1    |    1000.00|    1000.00|    1000.00|    2000.00|      5000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 2 |Salesman 1    |    2000.00|    2000.00|    2000.00|    2000.00|      8000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 3 |Salesman 2    |     100.00|       0.00|     100.00|     100.00|       300.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 4 |Salesman 3    |     100.00|     200.00|     100.00|     200.00|       600.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 5 |Salesman 3    |    1000.00|    2000.00|    1000.00|    1000.00|      5000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 6 |Salesman 3    |    1000.00|    2000.00|    1000.00|    4000.00|      8000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 7 |Salesman 4    |    2000.00|    2000.00|    3000.00|    2000.00|      9000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 8 |Salesman 5    |     500.00|     400.00|     500.00|     600.00|      2000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer 9 |Salesman 6    |     200.00|     200.00|     200.00|     400.00|      1000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer10 |Salesman 6    |    1000.00|    1000.00|    2000.00|    1000.00|      5000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer11 |Salesman 7    |    2000.00|    2000.00|    1000.00|    1000.00|      6000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+
|Customer12 |Salesman 8    |    2000.00|    2000.00|    2000.00|    2000.00|      8000.00|
+-----------+--------------+-----------+-----------+-----------+-----------+-------------+

现在,挑战:

列数需要根据日期范围而有所不同。例如; when Jan to April is selected, I should get 4 columns for revenue plus 1 column for Total revenue.当上一年的10月到今年4月份被选中时,我应该获得7列的收入加1栏,总收入。

【问题讨论】:

如果你在使用Oracle,那么不要标记为SQL Server! 感谢理查德的帮助。 您将需要使用解码,已删除我的答案,因为它不能满足您的要求 什么是“解码”以及如何使用它?谢谢你的回答。这是最明智的。 基于月份转换数据很容易,尤其是在您使用 11g 的情况下(但您也标记为 10g,这令人困惑)。但是,基于数据的动态列数并不容易;使用动态 SQL 是可能的,并且有一些聪明的解决方案,但它可能有点矫枉过正。您的报告能否显示今年剩余时间的零值列? 【参考方案1】:

您必须在 select & group by 中添加 trunc(C.REVENUE_DATE,'MM')。然后您的结果将按列显示。然后你必须做枢轴才能得到你所展示的。

SELECT 
  DISTINCT C.CUSTOMER_CODE
, MS.SALESMAN_NAME
, SUM(C.REVENUE_AMT) Rev_Amt
trunc(C.REVENUE_DATE,'MM')

from ...
...
where ...
GROUP BY C.CUSTOMER_CODE, MS.SALESMAN_NAME , trunc(C.REVENUE_DATE,'MM')

ORDER BY C.CUSTOMER_CODE, MS.SALESMAN_NAME

【讨论】:

感谢您的回复。我很感激。但是,当我按照您的建议添加该代码时,我只有一列给出了完整的日期。例如; 2015-01-01T00:00:00-08:00

以上是关于需要根据日期范围参数包含不同列的报告的主要内容,如果未能解决你的问题,请参考以下文章

Hive SQL - 检索日期范围中存在的列的不同值

SQL BigQuery - 插入具有不同日期范围的行

如何在 SQL 中为不同月份运行不同的日期范围

如何添加报表服务中没有匹配的列(SSRS)

R - 使用不同数据框架中的日期,检查日期范围是否包含某个值。

WooCommerce 管理员报告:根据日期范围获取自定义产品报告