Sql 如何计算不同年份每天的平均值

Sql 如何计算不同年份每天的平均值,sql,sql-server,Sql,Sql Server,我试图计算在2018年和2017年这两个年份,每天显示apple的平均次数,增量为3。要做到这一点,我尝试使用setNum和exNum这两种方法,它们的差异是3 ID Year Text setNum ExNum ------------------------------------------------- 1 2018-01-21 apple 1 3 2 2017-08-03 app

我试图计算在
2018年和
2017年
这两个年份,每天显示
apple
的平均次数,增量为
3
。要做到这一点,我尝试使用
setNum
exNum
这两种方法,它们的差异是
3

ID     Year           Text      setNum    ExNum
-------------------------------------------------
1      2018-01-21     apple       1         3
2      2017-08-03     apple       2         5
3      2018-03-02     banana      1         3
4      2018-05-22     apple       1         3
5      2018-12-12     apple       3         6
6      2017-04-13     apple       3         6
我当前的查询是:

SELECT
    2017 = avg(case when Year BETWEEN '2017-01-01' AND '2017-12-31' then 1 else 0 end),
    2018 = avg(case when Year BETWEEN '2018-01-01' AND '2018-12-31' then 1 else 0 end)
FROM
    exampleTable
WHERE
    Text LIKE '%apple%'
这项工作目前产出:

2017  2018
 0     0

注意:原始表格只有一个文本列
Increment
,其值类似于
1-3
。也就是说,
1-3
表示
setNum
为1,而
ExNum
为3。

将数值增量范围存储为文本的决定不是一个好的决定,理想情况下,应该将增量的两个点存储在单独的列中。也就是说,我们可以做一些事情来解决这个问题:

SELECT
    YEAR(Year) AS Year,
    COUNT(CASE WHEN 3 BETWEEN CAST(LEFT(Increment, CHARINDEX('-', Increment)-1) AS int) AND
              CAST(RIGHT(Increment, LEN(Increment) - CHARINDEX('-', Increment)) AS int)
               THEN 1 END) AS apple_3_cnt
FROM exampleTable
WHERE
    TEXT LIKE '%apple%'
GROUP BY
    YEAR(year);

在这里,我按年份进行汇总,然后对记录进行有条件计数,每年苹果的增量范围为3。为此,我分离出增量范围的两端,然后将它们转换为整数

编辑:

根据您更新的表,我们可以尝试更简单的查询:

SELECT
    YEAR(Year) AS Year,
    COUNT(CASE WHEN 3 BETWEEN setNum AND ExNum THEN 1 END) AS apple_3_cnt
FROM exampleTable
WHERE
    TEXT LIKE '%apple%'
GROUP BY
    YEAR(year);

将数值增量范围存储为文本的决定不是一个好的决定,理想情况下,应该将增量的两个点存储在单独的列中。也就是说,我们可以做一些事情来解决这个问题:

SELECT
    YEAR(Year) AS Year,
    COUNT(CASE WHEN 3 BETWEEN CAST(LEFT(Increment, CHARINDEX('-', Increment)-1) AS int) AND
              CAST(RIGHT(Increment, LEN(Increment) - CHARINDEX('-', Increment)) AS int)
               THEN 1 END) AS apple_3_cnt
FROM exampleTable
WHERE
    TEXT LIKE '%apple%'
GROUP BY
    YEAR(year);

在这里,我按年份进行汇总,然后对记录进行有条件计数,每年苹果的增量范围为3。为此,我分离出增量范围的两端,然后将它们转换为整数

编辑:

根据您更新的表,我们可以尝试更简单的查询:

SELECT
    YEAR(Year) AS Year,
    COUNT(CASE WHEN 3 BETWEEN setNum AND ExNum THEN 1 END) AS apple_3_cnt
FROM exampleTable
WHERE
    TEXT LIKE '%apple%'
GROUP BY
    YEAR(year);
试试下面

SELECT
    avg(case when Year BETWEEN '2017-01-01' AND '2017-12-31' then setNum+ExNum end) as 2017 
    avg(case when Year BETWEEN '2018-01-01' AND '2018-12-31' then setNum+ExNum end) as 2018
FROM
    exampleTable
WHERE
    Text LIKE '%apple%'
试试下面

SELECT
    avg(case when Year BETWEEN '2017-01-01' AND '2017-12-31' then setNum+ExNum end) as 2017 
    avg(case when Year BETWEEN '2018-01-01' AND '2018-12-31' then setNum+ExNum end) as 2018
FROM
    exampleTable
WHERE
    Text LIKE '%apple%'

你的问题很好。唯一的问题是如何以及在哪里分配结果。 请改用此语法

SELECT
 avg(case when Year BETWEEN '2017-01-01' AND '2017-12-31' then 1 else 0 end) as A2017,
 avg(case when Year BETWEEN '2018-01-01' AND '2018-12-31' then 1 else 0 end) as A2018
FROM
    exampleTable
WHERE
    Text LIKE '%apple%'

请注意,您不能使用数字作为变量名。

您的查询很好。唯一的问题是如何以及在哪里分配结果。 请改用此语法

SELECT
 avg(case when Year BETWEEN '2017-01-01' AND '2017-12-31' then 1 else 0 end) as A2017,
 avg(case when Year BETWEEN '2018-01-01' AND '2018-12-31' then 1 else 0 end) as A2018
FROM
    exampleTable
WHERE
    Text LIKE '%apple%'

请注意,不能将数字用作变量名。

预期的输出是什么?平均值是什么意思?3的增量是什么意思?我要找的平均值中的增量是3,它们之间的差异是3。通常在人们回答后,你不应该改变你的问题,特别是如果这会使已经给出的答案无效。平均值是多少?苹果在2017年出现2次,2018年出现3次(总共4次中有3次)。平均产量是多少?预期产量是多少?平均值是什么意思?3的增量是什么意思?我要找的平均值中的增量是3,它们之间的差异是3。通常在人们回答后,你不应该改变你的问题,特别是如果这会使已经给出的答案无效。平均值是多少?苹果在2017年出现2次,2018年出现3次(总共4次中有3次)。平均值会是多少?我更新了我的表,以便使用一个值作为增量范围而不是文本,您如何使用
setNum
exNum
来计算平均值。是的,这是有效的。感谢堆,有一件小事,我如何让它以我想要的方式输出(请参阅上面的当前输出)。另一件事,如果我要在表格中添加更多的年份,我如何使它只显示特定的年份呢?布莱克说,有了这些要求。在这种情况下,我们可以对整个表进行聚合。我加入了一个年度检查。我更新了我的表格,以受益于使用一个值作为增量范围而不是文本,您将如何使用
setNum
exNum
来计算平均值。是的,这是有效的,感谢堆,一件小事,我如何让它以我想要的方式输出(请参阅上面的当前输出)。另一件事,如果我要在表格中添加更多的年份,我如何使它只显示特定的年份呢?布莱克说,有了这些要求。在这种情况下,我们可以对整个表进行聚合。我在这一年中加入了一项检查。使用count会给我总数,而不是我试图得到的平均数。@Blake,我已经修改了我的答案,你现在可以检查使用count会给我总数,而不是我试图得到的平均数。@Blake,我已经修改了我的答案,你现在可以检查了