【问题标题】:SQL Server : group by a function on a field an select thatSQL Server:按字段上的函数分组并选择
【发布时间】:2012-08-01 07:57:51
【问题描述】:

我有一个group by YEAR(mydate),MONTH(mydate)

我想选择它们作为一个独特的字段,例如

SELECT SUM(Price),YEAR(mydate) + '/' + MONTH(mydate)
FROM MyTable
GROUP BY YEAR(mydate), MONTH(mydate)

或类似的东西。

mydatesmalldatetime

有可能吗?

【问题讨论】:

  • 我不明白你在做什么 - 这个查询有效吗?或者如果不是:它以什么方式不能按您的意愿工作??
  • 我想知道每年/每月的总和(价格)
  • 好的 - 但是那个查询不是已经回答了这个问题吗?
  • 我收到了错误,因为 mydate 未在分组列表中提及

标签: sql sql-server datetime aggregation


【解决方案1】:

试试这个:

SELECT cast(YEAR(mydate) as CHAR(4))+'/'+cast(MONTH(mydate) as varchar(2))
FROM MyTable
Group by YEAR(mydate),MONTH(mydate)

【讨论】:

    【解决方案2】:

    您需要将它们转换为字符串

    试试

    SELECT convert(varchar(7), mydate ,111)
    FROM MyTable 
    GROUP BY convert(varchar(7), mydate ,111)
    

    【讨论】:

    • 我收到了错误,因为 mydate 未在分组列表中提及
    【解决方案3】:

    对于 MS SQL Server 2012,带有前导零:

    CAST(YEAR(mydate) AS VARCHAR(4)) + '/' +
    RIGHT('00' + CAST(MONTH(mydate) AS VARCHAR(2)), 2)
    

    【讨论】:

      【解决方案4】:

      这是我的解决方案 :) 我需要在 sqlserver 表(列 year_rif 和 month_rif)中获取较旧的日期,以从链接的 oracle 表中插入更新的记录(按月作业在 sqlserver 中镜像 oracle 表)

      DECLARE @anno_INIZIO int
      DECLARE @mese_INIZIO int
      
      select top(1) @mese_INIZIO= mese_rif,@anno_INIZIO=anno_rif 
       from dbo.ORACLE_BUDGET_MENSILI 
       group by  mese_rif,anno_rif 
       order by max(mese_rif/12+anno_rif) desc
      
      set @anno_inizio=coalesce(@anno_INIZIO ,2016)
      set @mese_INIZIO=coalesce(@mese_INIZIO,1)
      

      在第一次导入时,我假设从 2016 年 1 月开始获取数据 完整的工作是:

          DECLARE @anno_INIZIO int
          DECLARE @mese_INIZIO int
      --get max year/mont avaible in mirrored table
          select top(1) @mese_INIZIO= mese_rif,@anno_INIZIO=anno_rif from dbo.ORACLE_BUDGET_MENSILI group by  mese_rif,anno_rif order by max(mese_rif/12+anno_rif) desc
      --
          set @anno_inizio=coalesce(@anno_inizio,2016)
          set @mese_INIZIO=coalesce(@mese_INIZIO,1)
      -- query to linked oracle to get into table newer data
          SET @SQL='select * FROM OPENQUERY(ADL_REP,''
          SELECT CODICE_UO,ANNO_RIF,MESE_RIF,ID_CLASSE,BUDGET,ORE_MENSILI_OBIETTIVO FROM ADL.BUDGET_MENSILI where  mese_rif/12+anno_rif > '+convert(varchar(255),@mese_INIZIO/12+@anno_INIZIO)+'
          '')'
          INSERT INTO uat.[dbo].ORACLE_BUDGET_MENSILI EXECUTE sp_executesql @SQL
      

      【讨论】:

        【解决方案5】:
        SELECT CAST(DATENAME(yy, mydate) AS CHAR(4)) + '-' + CAST(DATENAME(mm, mydate) AS VARCHAR(2)) 'Date'
         ,SUM(Price)
        FROM [My Table]
        GROUP BY DATENAME(yy, mydate)
         ,DATENAME(ww, mydate)
        

        【讨论】:

        • 请同时提供答案的解释。
        • 虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加 context 将改善答案的长度长期价值。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。提及为什么这个答案比其他答案更合适也没有什么坏处。
        猜你喜欢
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多