【发布时间】:2019-05-08 23:00:42
【问题描述】:
我正在尝试使用联接从 4 个表中获取记录。这些表格是费率、承运人、仓库和保证金。我能够从这 4 个表中获取所需的记录,但是当我使用 group by 和聚合函数 (MIN) 时,我的 min sell 列是正确的,但是,其他数据,如 carrierID、depotID 和 ratesID 是不同的.
我有 OriginType (OT) 和 DestinatioType (DT),每个都有 2 个案例;仓库和门。因此,当我对它们进行分组时,我得到了四个选项(服务):
- 仓库到仓库
- 仓库到门
- 仓库门口
- 门到门
我正在尝试为这些服务中的每一项获取最低(费率)作为“销售”并显示它。卖出计算如下:
- 作为 A 的 autoRate 表有一个列 Buy、carrier、OT、DT、Origin (Value: Canberra)、Destination (Value: Melbourne) 和 Car (价值:4WD/Van)
- 左加入运营商作为 C 和
A.carrier = C.ID - C.Fuellevy 列作为百分比
((C.FuelLevy * A.buy) + C.FuelLevy)作为 EQ1 -
((EQ1 * 10%) + EQ1)作为 EQ2 - 每行的 EQ2 价格都有一个保证金表百分比。例如,如果 EQ2 的值为 400,那么它会在 Margin 表中查找范围(低和高分别为 350(低)和 500(高)),其百分比为 25%,因此
((EQ2 * 25%)+ EQ2)给出出售价值。
我不太清楚如何在这里上传我的数据和数据库表,所以我试着在这里解释一下我想要什么。
我构建的查询是:-
Select Depo.*, DL.id as DepoID, DL.carrier as CarNo, DL.depotCity, DL.depoSuburb, min(Depo.Sell) as sellcost , Depo.OriginType as OT From (
Select Mar.*, M.MarginPer, round((eq2 * M.MarginPer) + eq2)as Sell From (
Select GST.* , EQ1 as 'FinalEQ1' , round((EQ1 * .10) + EQ1,2) as eq2 From (
Select A.ID as RateID, A.Origin, A.OriginState, A.Destination, A.DestinationState, A.Carrier as RateCarrier, A.Car as CarType, A.Buy as Buy, A.OriginType, A.DestinationType ,
C.ID as CarrierID, C.Carrier, C.FuelLevy , round((A.buy * C.FuelLevy) + A.Buy, 2) As EQ1,
CONCAT(A.OriginType, ' to ' ,A.DestinationType ) as service,
D.id as DepoID, D.carrier as CarNo, D.depotCity, D.depoSuburb
from carrier C
left join autorates A on A.carrier = C.ID
left join dList D on D.carrier = C.ID
where A.origin = 'Canberra' and A.destination = 'Melbourne' and A.car = '4WD/Van' AND D.carrier = A.carrier AND A.goodsAllowed = 0
AND C.Disabled = 0
AND D.depotCity = 'Canberra'
order by EQ1
) As GST
order by eq2
) As Mar
Left Join margin M on Mar.eq2 >= M.low and Mar.eq2 <= M.high
order by Sell
) As Depo
Left Join dList DL on DL.Carrier = Depo.RateCarrier
Where DL.depotCity = 'Melbourne'
group by OT
order by sellcost
我们在这里看到的 sellcost 值是 412,而 carNo 是 51
在此屏幕截图中,carrierno 已更改,但 MIN 值保持不变。
【问题讨论】:
-
“其他数据不同”是什么意思?你的意思是你没有得到列的最小值的载体?如果您在分组时选择其他列,它会从组中的随机行中获取该列,不一定是带有
MIN()的行。要理解为什么,想象一下如果你有两个聚合函数,例如最小值和最大值。您希望它从哪一行获取其他列?或者,如果它是 AVG 之类的东西,甚至不是来自特定行怎么办? -
添加到 Barmar 的评论中,MIN 和 MAX 甚至不一定来自特定行。即使 MySQL 很友好地尝试为您提供伴随您计算的 MIN 的行值(如果您只计算一个 MIN),但在很多情况下您可能会有大量具有该值的行。
-
@Barmar 是的,我没有得到正确的运营商值。当我得到结果时,我得到了销售的 MIN 值,但运营商不同。我得到每个组值的下一行,因为我得到的 MIN 值都是正确的
-
这就是为什么大多数 SQL 数据库甚至不允许您选择不在
GROUP BY中的列的原因。 MySQL 有ONLY_FULL_GROUP_BY模式来控制是否允许。 -
@Barmar 我该如何使用
ONLY_FULL_GROUP_BY?