我有以下查询:
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
我不想表现出平均水平,只是我需要它的条件,但我不能解决我的问题。
where
子句中使用over
select type,avg(price) over(partition by pub_id),pub_id from dbo.titles
where avg(price) >= 15
GROUP BY
,但无法显示type
字段,因为它没有出现在聚合函数或GROUP BY
子句中
select type from dbo.titles
group by pub_id
having avg(price) >= 15
如何通过pub_id
显示类型和组
更新:
预期结果:
由于avg(价格)大于或等于15,因此显示如下:
我需要按pubID对行进行分组
TYPE
---------------
Businness
popular_comp
psychology_comp
trad_cook
发布于 2020-02-14 04:32:44
如果我正确地跟踪,您想知道哪个PubId的平均价格为>= 15?
如果是这样的话,那么它需要一个2步的查询。首先获取平均值并过滤掉不需要的PubId,然后选择并分组类型:
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];
结果是:
PubId Type
0877 mod_cook
0877 psychology
0877 trad_cook
0877 UNDECIDED
1389 business
1389 popular_comp
https://stackoverflow.com/questions/60219438
复制相似问题