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

时间:2018-10-22 08:24:28

标签: sql sql-server

我试图计算32018的年份中2017每天平均显示的次数setNum。为此,我尝试使用exNum3之间有区别的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。也就是说,ExNum表示 new Vue({ el: '#app', data: { data: [{id: 1}, {id: 2}, {id: 3}], }, methods: { addNewClass(index) { this.$refs.element[index].classList.add('custom-class') } }, })为1,而<script src="https://npmcdn.com/vue/dist/vue.js"></script> <div id="app"> <div v-for="(result, index) in data" :key="index"> <div ref='element' @click='addNewClass(index)' class='custom-container'> </div> </div>为3。

3 个答案:

答案 0 :(得分:4)

您决定将数字增量范围存储为文本不是一个好方法,理想情况下,您应该将增量的两点存储在单独的列中。话虽如此,我们可以做一些字符串奥林匹克运动来解决这个问题:

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);

enter image description here

Demo

在这里,我按年份进行汇总,然后对苹果的增量范围包含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);

答案 1 :(得分:1)

尝试以下

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%'

答案 2 :(得分:0)

您的查询很好。唯一的问题是如何以及在何处分配结果。 改用这种语法

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%'

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