0

注意——我是一个自学成才的新手!我在 Sequel Server 2008r2 中工作。我有大量详细的销售交易文件。我想按月/年创建销售人员的摘要,然后我可以将其导入 SSRS 并创建图表。我希望我的输出看起来像这样:

Salesperson1   Jul 2012   5000.00
Salesperson1   Aug 2012   6000.00
Salesperson1   Sep 2012   7000.00
Salesperson2   Jul 2012   1000.00
Salesperson2   Aug 2012   2000.00
Salesperson2   Sep 2012   3000.00
Salesperson3   Jul 2012   4000.00
Salesperson3   Aug 2012   5000.00
Salesperson3   Sep 2012   8000.00

例如,我可以毫不费力地提取数据并将日期输出为 2012 年 7 月。问题是它没有正确分组,因为它在每个实际交易日期都中断,而不是仅按我想要的 Mo/Yr 分组。另外,我目前正在输出文本,因此它按字母顺序而不是日历顺序列出日期。我在一个财政年度,所以我需要 7 月 12 日,8 月 12 日,。. . 4 月 13 日、5 月 13 日、6 月 13 日。我知道这样做是因为我如何转换日期,但我不知道有任何其他方法可以以我想要的格式输出日期。

CONVERT(CHAR(4),TPB105_CHARGE_DETAIL.chg_srv_ts,100) + CONVERT(CHAR(4),TPB105_CHARGE_DETAIL.chg_srv_ts,120) as [Mo/Yr]

感谢你给与我的帮助!PS - 当我查看我的消息草稿时,它正在一起运行示例输出,但每个销售人员/月应该在输出表中的单独行上。

4

1 回答 1

1

请不要为此将日期转换为字符串。使用内置的日期操作功能,例如MONTH(TPB105_CHARGE_DETAIL.chg_srv_ts)YEAR(TPB105_CHARGE_DETAIL.chg_srv_ts)

因此,您可能有一个查询元素,例如:

SELECT
   YEAR(TPB105_CHARGE_DETAIL.chg_srv_ts) as [Year],
   MONTH(TPB105_CHARGE_DETAIL.chg_srv_ts) as [Month],
   SUM(dbo.TPB105_CHARGE_DETAIL.chg_tot_at) as [Charges],
   (RTRIM(P.lst_nm)) + ', ' + (RTRIM(P.fst_nm)) AS [Provider]
FROM
   [...]
GROUP BY
   YEAR(TPB105_CHARGE_DETAIL.chg_srv_ts),
   MONTH(TPB105_CHARGE_DETAIL.chg_srv_ts),
   (RTRIM(P.lst_nm)) + ', ' + (RTRIM(P.fst_nm))
ORDER BY
   YEAR(TPB105_CHARGE_DETAIL.chg_srv_ts),
   MONTH(TPB105_CHARGE_DETAIL.chg_srv_ts)

这将比将日期更改为字符串更快、更准确、更高效。

另一种执行相同操作并为日期保留单个字段的方法是按月初分组。然后根据标签的需要将其格式化为字符串。

SELECT
   DATEADD(MONTH, DATEDIFF(MONTH, 0, TPB105_CHARGE_DETAIL.chg_srv_ts), 0),
   CONVERT(VARCHAR(3) , DATENAME(month, TPB105_CHARGE_DETAIL.chg_srv_ts)) + ' ' +
   CONVERT(VARCHAR(4) , YEAR(TPB105_CHARGE_DETAIL.chg_srv_ts)) AS MonthLabel,
   SUM(dbo.TPB105_CHARGE_DETAIL.chg_tot_at) as [Charges],
   (RTRIM(P.lst_nm)) + ', ' + (RTRIM(P.fst_nm)) AS [Provider]
FROM
   [...]
GROUP BY
   DATEADD(MONTH, DATEDIFF(MONTH, 0, TPB105_CHARGE_DETAIL.chg_srv_ts), 0),
   DATENAME(month, TPB105_CHARGE_DETAIL.chg_srv_ts),
    YEAR(TPB105_CHARGE_DETAIL.chg_srv_ts),
   (RTRIM(P.lst_nm)) + ', ' + (RTRIM(P.fst_nm))
ORDER BY
   DATEADD(MONTH, DATEDIFF(MONTH, 0, TPB105_CHARGE_DETAIL.chg_srv_ts), 0)

(但是,如果您可以在流程的后期而不是在 SQL 中格式化,最好这样做。尽可能将日期作为日期处理,仅在您真正需要时转换为字符串。原因示例:如果您的表示层有能力导出到 Excel,然后格式化的日期值将让用户在 Excel 中进行自己的分析,但如果您要导出预先格式化的字符串,用户将需要做额外的工作来恢复日期信息。此外,按字母顺序对日期名称进行排序通常不是用户想要的。)

于 2013-07-23T16:45:42.670 回答