【问题标题】:Select ID, Count(ID) and Group by Date选择 ID、计数 (ID) 和按日期分组
【发布时间】:2015-06-01 06:26:57
【问题描述】:

我有一个包含 id 和日期(月/年)列的文章表,首先我想计算 id 并按日期对它们进行分组,然后我想查看哪个 id 属于单个日期组像这样查询:

id   date   count
-----------------
1    01/2015   2
2    01/2015   2
3    02/2015   1
4    03/2015   4
5    03/2015   4
6    03/2015   4
7    03/2015   4

我有 2 个查询

Select Count(id) 
from article 
group by date

Select id 
from article

给出结果;

count date            id  date
-------------         ----------
2     01/2015         1  01/2015
1     02/2015         2  01/2015 
4     03/2015         3  02/2015

我需要一个像

这样的查询
select count(id), id, date 
from....

它带来了在我的 C# 代码中使用的 id、count、date 列。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • Count 的相关子查询。

标签: sql sql-server date count group-by


【解决方案1】:
SELECT id,
       date,
       COUNT(*) OVER (PARTITION BY date) AS Count
FROM article

Sql fiddle

【讨论】:

    【解决方案2】:

    不清楚您希望如何在结果中生成 id 字段。如果你 想要手动生成它然后使用RANK() 或者如果你想得到它 从表id 值中,您可以使用max()min()(取决于 根据您的预期结果)

    使用RANK()Fiddle Demo Here

    试试:

    create table tt (id int null, dt varchar(8),count int)
    insert tt values
    (1,'01/2015',2),
    (2,'01/2015',2),
    (3,'02/2015',1),
    (4,'03/2015',4),
    (5,'03/2015',4),
    (6,'03/2015',4),
    (7,'03/2015',4)
    

    查询:

     select count(id) as count,dt,RANK() 
        over(order by count(id)) as id from tt group by dt
    

    EDIT2: 或者你可以使用MAX()MIN()

    喜欢:

    select count(id) as count,dt,Min(id) as id from tt group by dt
    

    select count(id) as count,dt,MAX(id) as id from tt group by dt
    

    【讨论】:

      【解决方案3】:

      不能在一个查询中完全做到这一点,但您可以使用 CTE 生成单个结果集:

      create table #tt (id int null, dt varchar(8))
      insert #tt values
      (1,'01/2015'),
      (2,'01/2015'),
      (3,'02/2015'),
      (4,'03/2015'),
      (5,'03/2015'),
      (6,'03/2015'),
      (7,'03/2015')
      
      ;with cteCount(d, c) AS
      (
          select dt, count(id) from #tt group by dt
      )
      select id, dt, c
      from #tt a
      inner join cteCount cc
      on a.dt = cc.d
      
      drop table #tt
      

      结果:

      id  dt      c
      1   01/2015 2
      2   01/2015 2
      3   02/2015 1
      4   03/2015 4
      5   03/2015 4
      6   03/2015 4
      7   03/2015 4
      

      【讨论】:

        【解决方案4】:
        if not exists(select * from TEST.sys.objects where type=N'U' and name=N'article')
        begin
            create table article(
            [id] int,
            [date] date)
        end
        

        有了这些数据:

        insert into article(id,date) values(1,convert(date,'15/01/2015',103));
        insert into article(id,date) values(1,convert(date,'15/02/2015',103));
        insert into article(id,date) values(2,convert(date,'15/03/2015',103));
        insert into article(id,date) values(2,convert(date,'15/01/2015',103));
        insert into article(id,date) values(3,convert(date,'15/02/2015',103));
        insert into article(id,date) values(4,convert(date,'15/03/2015',103));
        insert into article(id,date) values(5,convert(date,'15/01/2015',103));
        insert into article(id,date) values(5,convert(date,'15/02/2015',103));
        insert into article(id,date) values(1,convert(date,'15/03/2015',103));
        insert into article(id,date) values(2,convert(date,'15/01/2015',103));
        insert into article(id,date) values(3,convert(date,'15/02/2015',103));
        insert into article(id,date) values(4,convert(date,'15/03/2015',103));
        insert into article(id,date) values(5,convert(date,'15/01/2015',103));
        insert into article(id,date) values(1,convert(date,'15/02/2015',103));
        insert into article(id,date) values(2,convert(date,'15/03/2015',103));
        insert into article(id,date) values(3,convert(date,'15/01/2015',103));
        insert into article(id,date) values(4,convert(date,'15/03/2015',103));
        
        select id,[date], count(id) [count] from article
        group by [date],[id]
        
        the result:
        
        id  date    count
        1   2015-01-15  1
        1   2015-02-15  2
        1   2015-03-15  1
        2   2015-01-15  2
        2   2015-03-15  2
        3   2015-01-15  1
        3   2015-02-15  2
        4   2015-03-15  3
        5   2015-01-15  2
        5   2015-02-15  1
        

        【讨论】:

        • 用他的原始结果集试试这个,它会更清楚为什么这不起作用。请注意,您的示例数据有 17 行,但您的查询仅返回 10。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 2019-06-06
        相关资源
        最近更新 更多