SQL JOIN或GROUP BY变体?

时间:2017-06-01 15:04:33

标签: mysql sql join group-by

我有一个名为“articulos_precios”的表格如下:

 articulo_id  precio  precio_empresa_id
 ----------- -------- -----------------
      1         10          11
      2         15          12
      1         20          13
      3         45          13
      2         10          13
      3         40          11
      1         25          12
      2         10          11
      3         40          12

我需要获得以下内容:

 articulo_id  precio1  precio2   precio3
 ----------- -------- --------- ---------
      1         10       25         20
      2         10       15         10     
      3         40       40         45

其中:

precio1 是precio_empresa_id的价格:11,

precio2 是precio_empresa_id的价格:12

precio3 是precio_empresa_id的价格:13

我试过这个查询:

select M.articulo_id,M.precio1,M.precio2,U.precio3 from
(select M.articulo_id,M.precio1,M.precio2 from
  (select Z.articulo_id,Z.precio as precio1 from precios_articulos Z where Z.precio_empresa_id=42) W full join
  (select Y.articulo_id,Y.precio as precio2 from precios_articulos Y where Y.precio_empresa_id=43) V
on W.articulo_id=V.articulo_id) M full join
  (select X.articulo_id,X.precio as precio3 from precios_articulos X where X.precio_empresa_id=42) U
on M.articulo_id=U.articulo_id;

但它的表现很差。 可以使用Group By ?? 的某些变体来实现它,或者有人知道该怎么做?

这个问题已经被重复尊重:MySQL pivot table, 主要区别在于,在此示例中,不计算事件,而是对表的内容进行分组和重组。关心@Barmar

1 个答案:

答案 0 :(得分:1)

演示文稿应在表示层处理。但是,如果你必须......你可以这样做:

SELECT articulo_id
     , max(case when precio_empresa_ID = 11 then precio end) as Precio1
     , max(case when precio_empresa_ID = 12 then precio end) as Precio2
     , max(case when precio_empresa_ID = 13 then precio end) as Precio3
FROM articulos_precios
GROUP BY articulo_id

注意:如果您需要额外的precio_empresa_ID,则必须添加其他case和max语句。

如果需要,可以使用动态SQL来完成;但这样可以提供常规构造。

如果您的数据有多次出现而您需要对它们进行求和/计数而不是仅显示值,而不是使用max,您可以使用求和或计数。

SELECT articulo_id
     , sum(case when precio_empresa_ID = 11 then coalesce(precio,0) end) as Precio1
     , sum(case when precio_empresa_ID = 12 then coalesce(precio,0)end) as Precio2
     , sum(case when precio_empresa_ID = 13 then coalesce(precio,0)end) as Precio3
FROM articulos_precios
GROUP BY articulo_id