【问题标题】:how to get value every day of month with mssql如何使用 mssql 获取每月的每一天的价值
【发布时间】:2018-12-23 19:38:30
【问题描述】:

我有栏目详情

Create table details(
    Id [nvarchar](255) primary key
    CurrentValue smallint,
    CreateAt DateTime
)

CREATE TABLE Dates (
  d DATE,
  PRIMARY KEY (d)
)
DECLARE @dIncr DATE = '2000-01-01'
DECLARE @dEnd DATE = '2100-01-01'

WHILE ( @dIncr < @dEnd )
BEGIN
  INSERT INTO Dates (d) VALUES( @dIncr )
  SELECT @dIncr = DATEADD(DAY, 1, @dIncr )
END

我想从日期和到日期获取列当前值,但有时不是每天都输入当前值,所以我想获取从日期和到日期的每一天。

这是我的查询:

select 
AVG(rd1.CurrentValue)
from details
left join Dates as c  ON c.d BETWEEN '07-01-2018' AND '07-29-2018'
GROUP BY c.d
order by c.d

我不知道该怎么做

以及如何平均

我期望的数据:

         Date  CurrentValue
    ========= =======
     1/2/2009    1500
     2/2/2009    2300
     3/2/2009     300
     4/2/2009    2200
     5/2/2009    0
    ...
    30/2/2009    1500
    etc.

【问题讨论】:

  • 您创建了一个名为 DETAILS 的表和一个名为 currentvalue 的列,但您的查询引用了一个名为 RoundDetails 的表和一个名为 CurrentWeight 的列
  • 哦,对不起,我打错名字了,
  • 但我不能加入两个表
  • 您能否为您的表details 提供一些示例数据以及您的预期结果?
  • 好的,等我一下

标签: sql sql-server statistics


【解决方案1】:

您只需要将 join 从“日期”表转到 Details 表,而不是反过来。通过这种方式,您可以获得所有 Dates 值以及任何匹配的 Details 值:

select c.d
      ,avg(rd1.CurrentValue) as AverageValue
from Dates as c
    left join details as d
        on c.d = d.CreateAt
where c.d between '07-01-2018' and '07-29-2018'
group by c.d
order by c.d

【讨论】:

  • 我能再问你一个问题吗?如果我的详细信息表与其他表有关系(一对多user-detail)那么如何加入 3 列用户-详细信息-日历。喜欢的用户本月有多少详细信息
  • @beginerdeveloper:将 c.d 添加到选定的列并从 LEFT 切换到 RIGHT 连接应该完成相同的操作
  • @PabloHenkowski 是的,你是对的。但是在我看来,将right joins 添加到脚本中会增加复杂性,从而使阅读脚本和理解它的作用变得更加困难。
  • @beginerdeveloper 请不要在 cmets 中提出其他问题。如果您在此处的问题之外还有其他要求,作为显示您尝试过的内容和面临的困难的另一个问题。
  • @iamdave 好的,我明白了
【解决方案2】:

将您的 LEFT JOIN 更改为

left join Dates as c  ON C.d = rd1.CreateAt
                        AND c.d BETWEEN '07-01-2018' AND '07-29-2018'

【讨论】:

  • 抱歉,当我应用您的左连接时出现此错误Column 'details.CurrentWeight' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
  • 这是我在之前的评论中强调的。您的表定义和查询引用不同的东西。 CurrentWeight 不存在于 details 表中
  • 是的,我在本地数据库中使用这个名称,它是一样的
【解决方案3】:
  1. date 表格只包含日期范围,没有间隔,对吗?
  2. 什么是 d 列在餐桌日期?
  3. currentvalueCurrentWeight ?为什么在您的代码中是 CurrentValue 但错误是 CurrentWeight

尝试使用此代码,我假设列 d 是表 date 中的日期。

date 表将是主表,因为日期没有间隔,所以将其更改为右连接。我们只会从表明细中获取数据(如果有的话),所以在使用平均值时使用 ISNULL 将空数据设置为零。

select c.d as [Date],
AVG(ISNULL(rd1.CurrentValue,0)) as [CurrentValue]
from details
right join Dates as c  ON c.d BETWEEN '07-01-2018' AND '07-29-2018'
GROUP BY c.d
order by c.d

【讨论】:

  • currentvalue 和 CurrentWeight 相同,我在本地数据库中使用 currentWeight,是的,d 列是表 Dates 中的日期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多