【问题标题】:How to select the last 12 months in sql?如何在sql中选择过去12个月?
【发布时间】:2015-08-26 19:55:53
【问题描述】:

我需要选择过去 12 个月。正如您在图片中看到的,May 出现了两次。 但我只希望它发生一次。它必须是最新的。 另外,表格应该保持这种结构,最近的月份在底部。

这是查询:

SELECT Monat2,
       Monat,
       CASE WHEN NPLAY_IND = '4P'
               THEN 'QuadruplePlay'
            WHEN NPLAY_IND = '3P'
               THEN 'TriplePlay'
            WHEN NPLAY_IND = '2P'
               THEN 'DoublePlay'
            WHEN NPLAY_IND = '1P'
               THEN 'SinglePlay'
       END AS Series,
       Anzahl as Cnt
FROM T_Play_n
where NPLAY_IND != '0P'
order by Series asc ,Monat

这是新的查询

SELECT sub.Monat2,sub.Monat,
CASE WHEN NPLAY_IND = '4P'
    THEN 'QuadruplePlay'
     WHEN NPLAY_IND = '3P'
    THEN 'TriplePlay'
     WHEN NPLAY_IND = '2P'
    THEN 'DoublePlay'
    WHEN NPLAY_IND = '1P'
    THEN 'SinglePlay'
END
AS Series, Anzahl as Cnt FROM (SELECT ROW_NUMBER () OVER (PARTITION BY Monat2 ORDER BY Monat DESC)rn, 
                 Monat2,
                 Monat,
                 Anzahl,
                 NPLAY_IND
            FROM T_Play_n)sub
 where sub.rn = 1

它只显示月份一次,但它不会对每个系列都显示。 所以每次播放都应该有 12 个月。

【问题讨论】:

  • 'distinct' 或 'group by' 怎么样
  • 您当前的查询会有所帮助
  • 你使用哪些 rdbms?
  • 为什么一个月存储两次? (作为 May 和第 2 栏的 05 部分。)
  • @GiorgiNakeuri 我正在使用 SQL Server Management Studio

标签: sql sql-server select


【解决方案1】:
WITH R(N) AS
(
    SELECT 0
    UNION ALL
    SELECT N+1 
    FROM R
    WHERE N < 12
)

SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,-N,GETDATE())),3) AS [month]
FROM R

With R(N) 是公用表表达式。R 是您正在生成的结果集(或表)的名称。 N 是月份。

【讨论】:

    【解决方案2】:

    SQL Server 中你可以这样做:

    SELECT DateMonth, DateWithMonth -- Specify columns to select
    FROM Tbl -- Source table
    WHERE CAST(CAST(DateWithMonth AS INT) * 100 + 1 AS VARCHAR(20)) >= DATEADD(MONTH, -12,GETDATE()) -- Condition to return data for last 12 months
    GROUP BY DateMonth, DateWithMonth -- Uniqueness
    ORDER BY DateWithMonth -- Sorting to get latest records on the bottom
    

    【讨论】:

      【解决方案3】:

      所以听起来您想要选择包含最后出现的月份的行。像这样的东西应该可以工作:

      select * from [table_name]
      where id in (select max(id) from [table_name] group by [month_column])
      

      括号中的最后一个选择将获得每个月最后一次出现的 id 列表。如果您显示的年+月列尚未按降序排列,您可能希望改为最大化此列。

      【讨论】:

        【解决方案4】:

        OracleSQL-Server 中,您可以使用ROW_NUMBER

        name = 月份名称和num = 月份编号:

          SELECT sub.name, sub.num
            FROM (SELECT ROW_NUMBER () OVER (PARTITION BY name ORDER BY num DESC) rn,
                         name,
                         num
                    FROM tab) sub
           WHERE sub.rn = 1
        ORDER BY num DESC;
        

        【讨论】:

        • 如何在 SQL Server Management Studio 中进行操作?
        • @fusionchart_help,在sql server中完全一样
        • @Giorgi Nakeuri,谢谢。它在我的 IDE 中没有工作,但你是对的。
        • @JonTofte-Hansen 我试过这样但它并没有真正起作用-->我用新查询更新了我的帖子
        • @fusionchar_help,看来您需要在子查询中包含 T_Play_n 中的所有字段。
        【解决方案5】:

        你可以使用这样的东西(表 dbo.Nums 包含从 0 到 11 的 int 值)

        SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19991201', CURRENT_TIMESTAMP) + n - 12, '19991201'),
               DATENAME(MONTH,DateAdd(Month, DATEDIFF(month, '19991201', CURRENT_TIMESTAMP) + n - 12, '19991201'))
        FROM dbo.Nums
        

        【讨论】:

          【解决方案6】:

          我建议使用group by 作为月份名称,使用max 函数作为数字部分。如果不是数字,请使用to_number()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多