MySQL在另一个Select中选择

MySQL在另一个Select中选择,mysql,select,join,Mysql,Select,Join,我有一个问题如下 select Sum(If(departments.vat, If(weeklytransactions.weekendingdate Between '2011-01-04' And '2099-12-31', weeklytransactions.takings / 1.2, If(weeklytransactions.weekendingdate Between '2008-11-30' And '2010-01-01', weeklytransactio

我有一个问题如下

select
  Sum(If(departments.vat, If(weeklytransactions.weekendingdate Between
  '2011-01-04' And '2099-12-31', weeklytransactions.takings / 1.2,
  If(weeklytransactions.weekendingdate Between '2008-11-30' And '2010-01-01',
  weeklytransactions.takings / 1.15, weeklytransactions.takings / 1.175)),
  weeklytransactions.takings)) As Total,
  weeklytransactions.weekendingdate,......
select format(Max(Distinct vat_rates.Vat_Rate),3) From vat_rates Where
vat_rates.Vat_From <= '2011-01-03'
另一个返回增值税税率,如下所示

select
  Sum(If(departments.vat, If(weeklytransactions.weekendingdate Between
  '2011-01-04' And '2099-12-31', weeklytransactions.takings / 1.2,
  If(weeklytransactions.weekendingdate Between '2008-11-30' And '2010-01-01',
  weeklytransactions.takings / 1.15, weeklytransactions.takings / 1.175)),
  weeklytransactions.takings)) As Total,
  weeklytransactions.weekendingdate,......
select format(Max(Distinct vat_rates.Vat_Rate),3) From vat_rates Where
vat_rates.Vat_From <= '2011-01-03'
我想用低级查询替换硬编码的if语句,用weeklytransactions.weekendingdate替换低级查询中的日期

在凯文的评论之后,这里是我试图开始工作的完整问题

Select Max(vat_rates.vat_rate) As r, 
If(departments.vat, weeklytransactions.takings / r, weeklytransactions.takings) As Total, 
weeklytransactions.weekendingdate, 
Week(weeklytransactions.weekendingdate), 
round(datediff(weekendingdate,     (if(month(weekendingdate)>5,concat(year(weekendingdate),'-06-01'),concat(year(weekendingdate)-1,'-06-01'))))/7,0)+1 as fyweek, 
cast((Case When Month(weeklytransactions.weekendingdate) >5 Then Concat(Year(weeklytransactions.weekendingdate), '-',Year(weeklytransactions.weekendingdate) + 1) Else Concat(Year(weeklytransactions.weekendingdate) - 1, '-',Year(weeklytransactions.weekendingdate)) End) as char) As fy,
business_units.business_unit 
From departments Inner Join (business_units Inner Join weeklytransactions On business_units.buID = weeklytransactions.businessUnit) On departments.deptid = weeklytransactions.departmentId 
Where (vat_rates.vat_from <= weeklytransactions.weekendingdate and business_units.Active = true and business_units.sales=1) 
Group By weeklytransactions.weekendingdate, business_units.business_unit Order By fy desc, business_unit, fyweek
问候
Pete

假设我正确地阅读了您的问题,您的问题是关于使用另一个SELECT的结果来返回主查询的结果,并且取决于您对SQL的熟悉程度,可能您还没有机会了解JOIN

如果在from子句中定义数据,则可以在SELECT中提取数据。例如,以下查询将起作用:

SELECT A.a, B.b
FROM A
    JOIN (SELECT aggregate(c) FROM C) AS B
请注意,子查询中没有对表A的引用。问题是,您不能像这样将它添加到查询中,因为子查询不知道它是子查询。因此,以下方法行不通:

SELECT A.a, B.b
FROM A
    JOIN (SELECT aggregate(c) FROM C WHERE C.someValue = A.someValue) AS B
回到基本点。显然,这里要做的是聚合与另一个表的每个记录相关联的一些数据。为此,您需要合并SELECT查询并使用GROUP BY:

回到您的表格,以下内容应该有效:

SELECT w.weekendingdate, FORMAT(MAX(v.Vat_Rate, 3)
FROM weeklytransactions AS w, vat_rates AS v
WHERE v.Vat_From <= w.weekendingdate
GROUP BY w.weekendingdate
为什么??因为vat_rates表没有出现在FROM子句中,而它应该出现在FROM子句中。让我们通过简化查询、删除对business_units表的所有引用以及不会对问题添加或删除任何内容的字段、计算和顺序,让这一点变得更加明显,留给我们以下内容:

SELECT MAX(vat_rates.vat_rate) AS r, 
  IF(d.vat, w.takings / r, w.takings) AS Total
FROM departments AS d
  INNER JOIN weeklytransactions AS w ON w.departmentId = d.deptid
WHERE vat_rates.vat_from <= w.weekendingdate
GROUP BY w.weekendingdate

从这里开始,假设它能工作,您只需将我删除的所有部分放回即可获得最终查询。我对这里的增值税税率有点怀疑,但我不知道你们在这方面的要求是什么,所以我让你们来确定它是否如预期的那样有效。

?有什么问题吗?谢谢,但是我不知道如何计算If声明中的增值税税率,因为我不知道如何处理增值税税率,即选择Maxvat_rates.vat_rate作为r,Ifdepartments.vat,weeklytransactions.takings/r,weeklytransactions.takings作为总计,。。。。如果我运行它,我找不到r,因为它在这一点上不存在。请您在上面的问题中澄清这一点好吗?从你在这里的评论来看,你的问题实际上与我试图回答的问题大不相同。确保提供不完整的查询,而不仅仅是选择和从之间的哪些查询是感兴趣的,尽可能清楚地说明您试图实现的目标,并解释您已经尝试过的内容以及它仍然带来的问题。除非人们按照我的方式做出重大假设,否则他们不会发布答案,因为实际问题的书写方式并不清楚。Kevin,在我最初的选择中,我使用硬编码的值进行计算,并希望在可能的情况下将增值税率返回if语句,以更具动态性的方法替换。呸,真是个疑问!这是您要更新的原始版本,还是正在进行的工作?你想把增值税税率值放在哪里?我假设的第一个IF语句?在任何情况下,您在问题中提出的查询都应该精简到最低限度,也就是说,如果我最后一个问题的答案是“是”,请删除对business_units表的所有引用,该表似乎没有在此处添加任何有意义的信息,以及除r和Total之外的字段。一旦我们使用简化查询帮助您解决问题,您应该能够自己将解决方案应用到大问题上。此外,您在上次评论中解释问题的方式让我明白,您希望在IF中用MAXvat_rates.vat_rate替换r。但如果你在这里寻求帮助,我想这并不是那么简单。。。如果您有来自MySQL的错误消息,请确保将其也放在您的问题中。我将在今天晚些时候的午餐时间再看一看你的问题和你的提问,如果问题及其背景越清楚,我就越不可能在黑暗中尝试。
SELECT IF(d.vat, w.takings / MAX(v.vat_rate), w.takings) AS Total
FROM vat_rates AS v, departments AS d
  INNER JOIN weeklytransactions AS w ON w.departmentId = d.deptid
WHERE v.vat_from <= w.weekendingdate
GROUP BY w.weekendingdate