我有一个名为“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
答案 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