簡體   English   中英

SQL聚合按列分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM