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