在 MySQL 中,我嘗試根據列之間的最大值選擇相應的值。
讓我們以表“價格”為例:
| ID | 供應商 | 價格1 | 數量1 |
|---|---|---|---|
| 1 | 微軟 | 8,27 | 1000 |
| 1 | 蘋果 | 10,25 | 2000年 |
| 1 | IBM | 12,25 | 3000 |
| 2 | 微軟 | 9,45 | 2000年 |
| 2 | 蘋果 | 7,55 | 4000 |
| 2 | IBM | 6,78 | 6000 |
我打算得到的結果是:
| ID | 價格_微軟 | 價格_蘋果 | 價格_ibm | 最好的價錢 | 最優價格對應數量 |
|---|---|---|---|---|---|
| 1 | 8,27 | 10,25 | 12,25 | 8,27 | 1000 |
| 2 | 9,45 | 7,55 | 6,78 | 6,78 | 4000 |
是否有可能避免自連接?或者自我加入只是這樣做的方式?
uj5u.com熱心網友回復:
如果您使用的是 MySQL 8
select distinct
id,
sum(case when supplier = 'Microsoft' then price1 else 0 end) over by_id price_ms,
sum(case when supplier = 'Apple' then price1 else 0 end) over by_id price_apple,
sum(case when supplier = 'IBM' then price1 else 0 end) over by_id price_ibm,
min(price1) over by_id best_price,
first_value(quantity1) over by_id_price best_price_qty
from prices
window
by_id as (partition by id),
by_id_price as (partition by id order by price1 asc)
演示
uj5u.com熱心網友回復:
這是我想出的解決方案,其中包括自聯接。我相信這是不可避免的,我想得越多。
SELECT
id,
SUM(CASE WHEN t1.supplier = 'Microsoft' THEN t1.price1 ELSE 0 END) AS 'price_microsoft',
SUM(CASE WHEN t1.supplier = 'Apple' THEN t1.price1 ELSE 0 END) AS 'price_apple',
SUM(CASE WHEN t1.supplier = 'IBM' THEN t1.price1 ELSE 0 END) AS 'price_ibm'
t2.price1 AS ‘best price’,
t2.quantity1 AS ‘best price corresponding quantity’
FROM prices
JOIN
(SELECT id, MIN(price1), quantity1 FROM prices GROUP BY id) AS t2
ON t1.id=t2.id GROUP BY id
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354048.html
