首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数据按组排列,并在条件下使用聚合函数?

将数据按组排列,并在条件下使用聚合函数?
EN

Stack Overflow用户
提问于 2020-02-14 03:07:54
回答 1查看 31关注 0票数 0

我有以下查询:

代码语言:javascript
运行
复制
TYPE            ID      PubID   Price
business        BU1032  1389    19,99
business        BU1111  1389    11,95
business        BU2075  0736    2,99
business        BU7832  1389    19,99
mod_cook        MC2222  0877    19,99
mod_cook        MC3021  0877    2,99
UNDECIDED       MC3026  0877    NULL
popular_comp    PC1035  1389    22,95
popular_comp    PC8888  1389    20,00
popular_comp    PC9999  1389    NULL
psychology      PS1372  0877    21,59
psychology      PS2091  0736    10,95
psychology      PS2106  0736    7,00
psychology      PS3333  0736    19,99
psychology      PS7777  0736    7,99
trad_cook       TC3218  0877    20,95
trad_cook       TC4203  0877    11,95
trad_cook       TC7777  0877    14,99

我希望按PubID对行进行分组,但同时需要评估检索数据的条件。条件是AVG(price) >= 15

我不想表现出平均水平,只是我需要它的条件,但我不能解决我的问题。

  1. I尝试使用OVER子句,但这需要在结果中显示平均值,而不能在where子句

中使用over

代码语言:javascript
运行
复制
    select type,avg(price) over(partition by pub_id),pub_id from dbo.titles
    where avg(price) >= 15

  1. 我尝试使用GROUP BY,但无法显示type字段,因为它没有出现在聚合函数或GROUP BY子句

代码语言:javascript
运行
复制
    select type from dbo.titles
    group by pub_id
    having avg(price) >= 15

如何通过pub_id显示类型和组

更新:

预期结果:

由于avg(价格)大于或等于15,因此显示如下:

我需要按pubID对行进行分组

代码语言:javascript
运行
复制
TYPE
---------------
Businness        
popular_comp
psychology_comp
trad_cook
EN

回答 1

Stack Overflow用户

发布于 2020-02-14 04:32:44

如果我正确地跟踪,您想知道哪个PubId的平均价格为>= 15?

如果是这样的话,那么它需要一个2步的查询。首先获取平均值并过滤掉不需要的PubId,然后选择并分组类型:

代码语言:javascript
运行
复制
CREATE TABLE dbo.Titles (
    [Type] varchar(20),
    [ID] char(6),
    [PubId] char(4),
    [Price] decimal(4,2)
)

INSERT dbo.Titles
VALUES 
('business',        'BU1032',  '1389',    19.99),
('business',        'BU1111',  '1389',    11.95),
('business',        'BU2075',  '0736',    2.99 ),
('business',        'BU7832',  '1389',    19.99),
('mod_cook',        'MC2222',  '0877',    19.99),
('mod_cook',        'MC3021',  '0877',    2.99 ),
('UNDECIDED',       'MC3026',  '0877',    NULL ),
('popular_comp',    'PC1035',  '1389',    22.95),
('popular_comp',    'PC8888',  '1389',    20.00),
('popular_comp',    'PC9999',  '1389',    NULL ),
('psychology',      'PS1372',  '0877',    21.59),
('psychology',      'PS2091',  '0736',    10.95),
('psychology',      'PS2106',  '0736',    7.00 ),
('psychology',      'PS3333',  '0736',    19.99),
('psychology',      'PS7777',  '0736',    7.99 ),
('trad_cook',       'TC3218',  '0877',    20.95),
('trad_cook',       'TC4203',  '0877',    11.95),
('trad_cook',       'TC7777',  '0877',    14.99);

WITH AvgPrices
AS (
    SELECT [PubId],
       AVG([Price]) as AvgPrice
    FROM dbo.Titles
    GROUP BY [PubId] 
)
SELECT p.[PubId],
       p.[Type]
FROM dbo.Titles p
JOIN AvgPrices av ON av.PubId = p.PubId AND av.AvgPrice >= 15.0
GROUP BY p.[PubId], p.[Type];

结果是:

代码语言:javascript
运行
复制
PubId   Type
0877    mod_cook
0877    psychology
0877    trad_cook
0877    UNDECIDED
1389    business
1389    popular_comp
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60219438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档