首页 > 解决方案 > 从不同的表中选择最大值作为列

问题描述

有2张桌子。表 1 被称为Purchases,它有类似的列IdCustomerName。数据如下:

Id, CustomerName
1 , Customer1
2 , Customer2
3 , Customer3

还有一个名为, , ,Items列的表。数据如下:IdPurchaseIdParameterNameParameterValue

Id, PurchaseId, ParameterName, ParameterValue
1 , 1         , 'Price'      , 100
2 , 1         , 'PercentOff' , 9
3 , 2         , 'Price'      , 200
4 , 2         , 'Price'      , 300
5 , 2         , 'PercentOff' , 4
6 , 2         , 'PercentOff' , 3 
7 , 3         , 'Price'      , 400

如您所见,每个 Purchase 都可以连接多个自定义参数。例如,id 为 2 的 Purchase 有 2 个Price参数和 2 个PercentOff参数。id 为 3 的购买只有一个参数,称为Price.

我正在尝试为每次购买选择最大的价格和最大的百分比折扣。这就是我的代码现在的样子:

SELECT
    p.Id,
    p.CustomerName,
    (SELECT 
        MAX(ParameterValue)
     FROM Items
     WHERE
        p.Id = PurchaseId 
        AND ParameterName = 'Price')
    AS BiggestPrice,
    (SELECT 
        MAX(ParameterValue)
     FROM Items
     WHERE
        p.Id = PurchaseId 
        AND ParameterName = 'PercentOff')
    AS BiggestPercentOff
FROM Purchases p

这个工作正常,但速度很慢。那么,如何摆脱子选择并加快速度呢?

请注意,某些购买可能没有Price任何东西。在这种情况下,我需要显示NULL.

我希望得到这样的数据:

Id, CustomerName, BiggestPrice, BiggestPercentOff
1 , Customer1   , 100         , 9
2 , Customer2   , 300         , 4
3 , Customer3   , 400         , NULL

标签: mysqlsql

解决方案


尝试这样做作为一个连接,例如

SELECT
    p.Id,
    p.CustomerName,
    MAX(CASE WHEN ParameterName = 'Price' THEN ParameterValue END) AS BiggestPrice,
    MAX(CASE WHEN ParameterName = 'PercentOff' THEN ParameterValue END) AS BiggestPercentOff
FROM Purchases p
LEFT JOIN Items i ON i.PurchaseId = p.Id
GROUP BY 
    p.Id,
    p.CustomerName
ID 顾客姓名 最大价格 最大百分比关闭
1 客户1 100 9
2 客户2 300 4
3 客户3 400 无效的

在 DB Fiddle 上查看工作演示

让我知道这是否适合您。


推荐阅读