【问题标题】:SQL Group by Year按年份划分的 SQL 组
【发布时间】:2011-05-11 12:19:42
【问题描述】:

这是我的查询。

select CONVERT(varchar, cast(date as datetime), 3)
from shoptransfer 
group by year (date)

我想按日期(varchar)列的年份部分进行分组,但是我收到以下错误:

选择列表中的“shoptransfer.Date”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

如何按日期列的年份部分分组?

【问题讨论】:

    标签: sql-server-2008 tsql


    【解决方案1】:

    怎么样:

    select datepart(yyyy, [date]) as [year]
    from shoptransfer 
    group by datepart(yyyy, [date])
    

    或者:

    select count(*) as qty, datepart(yyyy, [date]) as [year]
    from shoptransfer 
    group by datepart(yyyy, [date])
    order by [year]
    

    这是基于 OP 的命令:“我想按日期(varchar)列的年份部分分组”

    【讨论】:

    • 你想用 where SUBSTRING(productcode, 5, 3) like '%' 来达到什么目的?
    • @user589983 - 没必要问我,这是 OP 的查询,我只是将他的示例代码保持原样,但将其固定为GROUP BY
    • 我想选择完整的日期,您只是选择日期的年份部分。
    • @zain - 你的帖子说"want to group by year part of date",这就是我向你展示的方法。也许你可以改写你的问题并准确解释你想要什么。
    • @zain - 样本输入数据和你想要实现的样本永远不会受到伤害
    【解决方案2】:

    使用 MariaDB:

    SELECT year(date) FROM cost GROUP BY year(date)
    

    【讨论】:

    • 不鼓励使用纯代码的答案。请解释这与同一问题的其他答案有何不同。
    【解决方案3】:

    如果您想同时选择日期和年份,则不应使用 GROUP BY 子句,因为它将所有具有相似年份的行合并为一行。如果您想将所有具有相似年份的日期放在一起,您可以使用 ORDER BY:

    SELECT DATEPART('yyyy',date) AS Year,date
    FROM shoptransfer 
    

    SELECT DATEPART('yyyy',date) AS Year,date
    FROM shoptransfer
    ORDER BY DATEPART('yyyy',date) desc
    

    【讨论】:

      【解决方案4】:

      我不知道T-SQL,但是在一般的SQL中,group by子句中的内容必须与select子句中的每个非聚合函数列完全匹配。试试

      select CONVERT(varchar,cast(date as datetime),3)
      from shoptransfer 
      where 
      SUBSTRING(productcode, 5, 3) like '%'  group by CONVERT(varchar,cast(date as datetime),3)
      

      另外,where SUBSTRING(productcode, 5, 3) like '%' 没有过滤掉太多 - 也许将其删除。

      【讨论】:

        【解决方案5】:

        您应该将列 shoptransfer.Date 添加到 group by 子句中。

        select CONVERT(varchar,cast(date as datetime),3)
        from shoptransfer 
        where 
        SUBSTRING(productcode, 5, 3) like '%' 
        group by CONVERT(varchar,cast(date as datetime),3)
        

        【讨论】:

        • 谢谢!但这将按日期而不是年份分组。 (+1 鼓励)
        【解决方案6】:
        group by
        substring(CONVERT(varchar,comuln1,101),1,4)
        

        年份 2004年 2005年 2006

        【讨论】:

        • 这不起作用。问题是我们只能按我们选择的列分组。
        猜你喜欢
        • 2012-02-04
        • 2020-10-07
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        • 2020-10-27
        • 1970-01-01
        相关资源
        最近更新 更多