[英]SQL aggregate group by columns
我有一张桌子,看起来像这样:
price is_a is_b is_c ...
300 1 0 1 ...
500 0 1 0 ...
200 1 1 1 ...
400 0 1 1 ...
我现在想为每个“ is_”属性选择平均价格:
avg(price) is_a is_b is_c
250 1 0 0
367 0 1 0
300 0 0 1
我当前正在使用以下查询,该查询显然返回所有属性的所有可能组合(在这种情况下,与上面的表完全相同):
SELECT avg(price), is_a, is_b, is_c, ... FROM table GROUP BY is_a, is_b, is_c, ...
您将需要使用联合。 但是,您将两次计数某些事件:
SELECT avg(price), 1, 0, 0 ... FROM table WHERE is_a = 1
UNION
SELECT avg(price), 0, 1, 0 ... FROM table WHERE is_b = 1
UNION
SELECT avg(price), 0, 0, 1 ... FROM table WHERE is_c = 1
就像我说过的,如果存在与is_a 和 is_b匹配的记录,则它们的价格将计入第一列和第二列。
Use CTE to get your result :
CREATE TABLE #table(price INT,is_a INT,is_b INT,is_c INT)
INSERT INTO #table(price ,is_a ,is_b ,is_c)
SELECT 300,1,0,1 UNION ALL
SELECT 500,0,1,0 UNION ALL
SELECT 200,1,1,1 UNION ALL
SELECT 400,0,1,1
;WITH _CTEAvg ( Avgprice , is_a , is_b , is_c ) AS
(
SELECT AVG(price) , 1 , 0 , 0
FROM #table
WHERE is_a = 1
GROUP BY is_a
UNION ALL
SELECT AVG(price) , 0 , 1 , 0
FROM #table
WHERE is_b = 1
GROUP BY is_b
UNION ALL
SELECT AVG(price) , 0 , 0 , 1
FROM #table
WHERE is_c = 1
GROUP BY is_c
)
SELECT * FROM _CTEAvg
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.