Sql server 当另一列在特定范围内时,尝试平均1列

Sql server 当另一列在特定范围内时,尝试平均1列,sql-server,Sql Server,我试图找出一种产品在销售前一年中每个月的平均货架天数。我需要根据产品的价格范围在不同的栏目中进行分类。预期输出如下所示: Year | Month | 400-599 | 600-799| 800-999| Over 1000 2016 | 01 | 23 | 13 | 32 | 7 2016 | 02 | 13 | 19 | 21 | 16 但是下面提到的查询没有返回所需的结果。我做错了什么 USE DATABASE; G

我试图找出一种产品在销售前一年中每个月的平均货架天数。我需要根据产品的价格范围在不同的栏目中进行分类。预期输出如下所示:

Year | Month | 400-599 | 600-799| 800-999| Over 1000
2016 | 01    |   23    |  13    |   32   |  7
2016 | 02    |   13    |  19    |   21   | 16
但是下面提到的查询没有返回所需的结果。我做错了什么

USE DATABASE;  
GO
SELECT YEAR(datetime) AS 'YEAR', MONTH(datetime) AS 'MONTH',
CASE    WHEN price BETWEEN 400 AND 599 THEN AVG(days_on_shelf) AS '400-599',
        WHEN price BETWEEN 600 AND 799 THEN AVG(days_on_shelf) AS '600-799',
        WHEN price BETWEEN 800 AND 999 THEN AVG(days_on_shelf) AS '800-999',
        ELSE AVG(days_on_shelf) END AS 'Over 1000'
FROM TABLE1
GROUP BY MONTH(datetime), YEAR(datetime), price
ORDER BY YEAR, MONTH
)

看来价格不能低于400美元

我建议您仔细阅读有关case表达式的文档。当你尝试按价格分组时,你可能也会找到一本关于分组的好教程。尝试按价格分组,但仍能在同一行中获得不同价格范围的结果是没有意义的

还有另一种方法是使用旋转,但这似乎有些过头了

with a as (
    select year(dt) as "year", month(dt) as "month",
        case when price / 200 < 5 then price / 200 else 5 end as price_bucket,
        avg(days_on_shelf) as avg_days
    from t
    group by year(dt), month(dt), price / 200
)
select "year", "month",
    [2] as "400-599", [3] as "600-799", [4] as "800-999", [5] as "Over 1000"
from a pivot (min(avg_days) for price_bucket in ([2], [3], [4], [5])) p
order by "year", "month";

也请发布示例数据每个列都应该有自己的大小写。e、 g.当价格介于400和599之间时,平均价格为“400-599”,当价格介于400和599之间时,平均价格为。。。等等,非常感谢,@ZLK。成功了!谢谢,@Shawnt00。我的数据集要大得多,至少涵盖了10种产品的两年时间。我尝试了你的解决方案,但不知怎么的,我在字段中得到了很多空值,而它们都应该有一些价值。有没有什么具体的例子可以在这里使用?
with a as (
    select year(dt) as "year", month(dt) as "month",
        case when price / 200 < 5 then price / 200 else 5 end as price_bucket,
        avg(days_on_shelf) as avg_days
    from t
    group by year(dt), month(dt), price / 200
)
select "year", "month",
    [2] as "400-599", [3] as "600-799", [4] as "800-999", [5] as "Over 1000"
from a pivot (min(avg_days) for price_bucket in ([2], [3], [4], [5])) p
order by "year", "month";