2

我有一个看起来像下面这样的表......

id           price             condition         sell
21039        20.40             new               0 
21039        20.41             used              1
12378        10.40             new               1
12378        5                 used              0
45898        30.30             new               1
45898        12.20             used              0

注意:每个 id 只会有 1 个新的和已使用的值)

我想要做的是对具有相同 ID 号的所有行进行分组,但在此过程中为每个条件创建新列,这应该看起来像......

id           new_price         new_sell          used_price         new_sell
21039        20.40             0                 20.41              1
12378        10.40             1                 5                  0
45898        30.30             1                 12.20              0

我想出的只是以下查询,看起来很傻

SELECT id, price, condition, 
IF(price > 3, 1, 0)  AS sell
FROM products 
GROUP BY id 

我怎样才能获得第二张桌子的预期效果。

4

1 回答 1

3

这称为数据透视表CASE它是通过对您需要生成的每一列的一系列语句以及聚合MAX()SUM()消除 NULL 并将其折叠为单行来完成的。

SELECT
  id,
  SUM(CASE WHEN `condition` = 'new' THEN price ELSE 0 END) AS new_price,
  SUM(CASE WHEN `condition` = 'new' THEN sell ELSE 0 END) AS new_sell,
  SUM(CASE WHEN `condition` = 'used' THEN price ELSE 0 END) AS used_price,
  SUM(CASE WHEN `condition` = 'used' THEN sell ELSE 0 END) AS used_sell
FROM 
  products
GROUP BY id

如果没有SUM()and GROUP BY,您仍然会得到 2 行id,每行都有一半的列(condition在 中不匹配CASE)作为NULL。(SUM()也可以MAX()在这种情况下使用)消除了 NULL 并产生一行,因为聚合函数排除 NULL 值,而按GROUP BY对行进行分组id

这是SQLFiddle.com 上的一个工作示例

评论后更新:

sell基于计算price,只需替换sell CASE语句中的条件:

SELECT
  id,
  SUM(CASE WHEN `condition` = 'new' THEN price ELSE 0 END) AS new_price,
  SUM(CASE WHEN `condition` = 'new' AND price > 3 THEN 1 ELSE 0 END) AS new_sell,
  SUM(CASE WHEN `condition` = 'used' THEN price ELSE 0 END) AS used_price,
  SUM(CASE WHEN `condition` = 'used' AND price > 3 THEN 1 ELSE 0 END) AS used_sell
FROM 
  products
GROUP BY id

更新样本...

于 2012-11-28T02:40:07.937 回答