【问题标题】:Query to sum & count查询求和和计数
【发布时间】:2020-12-02 07:47:37
【问题描述】:

我的数据是这样的

Count   years
1     2020-08-11
1    2020-07-11
1    2019-09-01
1    2019-08-16
1    2019-05-04
1    2018-06-11

我正在编写一个查询,我必须在其中找到例如

我这样写了查询:

with sum_count as(
    select count(*) as 'Counts', years from [practice].[dbo].[People]
    where years<='2019-05-04'
    group by years)

    select sum(Counts) + 1 as Sum
    from  sum_count

您能否帮助对所有日期(例如 2020-08-11)做同样的事情 计数应为 5,总和为 6

【问题讨论】:

  • 请指定哪个 DBMS。
  • 嗨 nifriz 我正在 sql server 中编写查询

标签: sql sql-server sum


【解决方案1】:

你可以很简单地通过一个 select 语句来实现这一点,而不需要 cte:

Declare @td datetime = '20190504' 
SELECT COUNT([years])+1 FROM [practice].[dbo].[People] Where [years] <= @td

如果这件事你会重复很多,你可以把它作为一个存储过程

CREATE PROC proc_name (@dt datetime)
as    SELECT COUNT([years])+1 FROM [practice].[dbo].[People] Where [years] <= @td

你会这样称呼它

exec proc_name ('20200801') 

【讨论】:

  • 您好,非常感谢您的回答,如果我需要动态传递所有日期,我该如何修改查询,因为我需要对所有日期执行相同操作。
  • 不确定我是否听懂了您的问题。在上面的第一个示例中,您只需更改变量即可传递日期。因此,例如,如果您运行相同的查询并传递“20180505”,它将根据该日期返回结果。存储过程选项也一样,你只需调用它并传递你想要的日期
  • 如果您再解释一下您要达到的目标,这可以非常简单地完成,动态日期从何而来?
  • 对上面的建议有什么好处吗?
【解决方案2】:

如果我理解正确,您只需要一个窗口函数。下面列举了每一年的每一行:

select p.*,
       row_number() over (partition by year(years) order by years) as seqnum
from [practice].[dbo].[People] p;

不需要存储过程或辅助函数。

【讨论】:

    【解决方案3】:

    编写过程可以是一种方式,但如果您一心想要使用查询,您可以使用它。

    select count(1)+1 as sum,a.year1
    from
        (
        select distinct year as year1
        from [practice].[dbo].[People]
        
        ) a 
        inner join 
        [practice].[dbo].[People] b on b.year<=a.year1
        group by a.year1
    

    干杯!!!

    【讨论】:

    • 嗨奥尔德林,非常感谢您的帮助...当我执行上述查询时,我在数据库中收到此错误..以下是错误消息 Msg 156, Level 15 , 状态 1, 第 3 行 关键字 'select' 附近的语法不正确。消息 102,级别 15,状态 1,第 6 行 ')' 附近的语法不正确。你能帮帮我吗
    • 编辑了答案...我在查询中缺少“来自”...如果它解决了您的问题,请告诉我
    猜你喜欢
    • 2016-03-23
    • 2015-02-09
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多