将日期转换为Mo / Yr文本,以便我可以按Mo / Yr分组

时间:2013-07-23 16:16:52

标签: sql-server-2008-r2

抬头 - 我是一个自学新手!我在Sequel Server 2008r2工作。我有一份详细的销售交易文件。我想通过Mo / Yr的销售人员创建一个摘要,然后我可以导入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月。问题是它没有正确分组,因为它打破了每个ACTUAL交易日期,而不是仅仅分组我想要的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 - 当我查看我的消息草稿时,它一起运行示例输出,但每个销售人员/月应该在输出表中的单独行上。

1 个答案:

答案 0 :(得分: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中进行自己的分析,但如果要导出预格式化的字符串,则用户需要做额外的工作来恢复日期信息。按字母顺序排序日期名称通常不是用户想要的。)