Sql 按日期分组按月份、年份的范围

Sql 按日期分组按月份、年份的范围,sql,sql-server,tsql,Sql,Sql Server,Tsql,我这里有一个样品。我以前问过哪个有效,但当我进一步测试它时,我忘记了一个事实,那就是我还应该为它计算年份 简而言之,我想按月份范围对记录进行分组八月至一月(第1组)和二月至七月(第2组)。因为我想计算每6个月创建多少个学校对象。持续的趋势是具体的 结果集,例如: +-----------+-------+---------------+ | sc_object | count | range | +-----------+-------+---------------+ | pe

我这里有一个样品。我以前问过哪个有效,但当我进一步测试它时,我忘记了一个事实,那就是我还应该为它计算
年份

简而言之,我想按月份范围对记录进行分组<代码>八月
至一月(第1组)和二月至七月(第2组)。因为我想计算每6个月创建多少个学校对象。持续的趋势是具体的

结果集,例如:

+-----------+-------+---------------+
| sc_object | count | range         |
+-----------+-------+---------------+
| pencil    | 1     | 2013-8 2014-1 |
| eraser    | 1     | 2014-2 2014-7 |
| pencil    | 1     | 2014-2 2014-7 |
| sharpener | 1     | 2014-2 2014-7 |
| pencil    | 1     | 2014-8 2015-1 |
| eraser    | 1     | 2015-2 2015-7 |
| pencil    | 1     | 2015-2 2015-7 | 
| sharpener | 1     | 2015-2 2015-7 |
| eraser    | 1     | 2015-8 2016-1 | 
| sharpener | 2     | 2016-2 2016-7 | 
| pencil    | 1     | 2016-2 2016-7 |
| sharpener | 1     | 2016-8 2017-1 |
| eraser    | 1     | 2016-8 2017-1 |
+-----------+-------+---------------+

任何帮助都将不胜感激。非常感谢你

您可以这样做():


您可以根据月份和年份计算范围,然后汇总结果。

您可以这样做():


您可以根据月份和年份计算范围,然后汇总结果。

您可以这样做():


您可以根据月份和年份计算范围,然后汇总结果。

您可以这样做():


您根据月份和年份计算范围,然后汇总结果。

@BoyPasmo:不客气。你被否决了,因为你没有提供任何代码,但我查看了你的个人资料,发现SQL并不是你真正喜欢的东西。不用担心,请提前付款知道了!当然可以:D@BoyPasmo:不客气。你被否决了,因为你没有提供任何代码,但我查看了你的个人资料,发现SQL并不是你真正喜欢的东西。不用担心,请提前付款知道了!当然可以:D@BoyPasmo:不客气。你被否决了,因为你没有提供任何代码,但我查看了你的个人资料,发现SQL并不是你真正喜欢的东西。不用担心,请提前付款知道了!当然可以:D@BoyPasmo:不客气。你被否决了,因为你没有提供任何代码,但我查看了你的个人资料,发现SQL并不是你真正喜欢的东西。不用担心,请提前付款知道了!当然可以:D
WITH cteRanges
AS
(
    SELECT
            site,
            CASE
              WHEN MONTH(date) IN (1) THEN CAST(YEAR(date) - 1 AS VARCHAR(4)) + '-8' + ' ' + CAST(YEAR(date) AS VARCHAR(4)) + '-1'
              WHEN MONTH(date) IN (8, 9, 10, 11, 12) THEN CAST(YEAR(date) AS VARCHAR(4)) + '-8' + ' ' + CAST(YEAR(date) + 1 AS VARCHAR(4)) + '-1'
              ELSE CAST(YEAR(date) AS VARCHAR(4)) + '-2' + ' ' + CAST(YEAR(date) AS VARCHAR(4)) + '-7'
            END AS range
    FROM
            test
)

SELECT
          site,
          COUNT(*),
          range
FROM
          cteRanges
GROUP BY
          site,
          range
ORDER BY
          range,
          site;