Mysql 错误代码:1242。子查询返回超过1行(对于所有记录)
这里我需要通过AgentID获取所有记录组,但它显示错误:错误代码:1242。子查询返回超过1行 表:Mysql 错误代码:1242。子查询返回超过1行(对于所有记录),mysql,sql,Mysql,Sql,这里我需要通过AgentID获取所有记录组,但它显示错误:错误代码:1242。子查询返回超过1行 表: customerID amountreceived date_time area agentID paymentmode 1 2000 5/13/2014 hyd 1 cash enter code here DELIMITER $$ CREATE DEFINER=`ntc`@`%` PROCEDURE `spforal
customerID amountreceived date_time area agentID paymentmode
1 2000 5/13/2014 hyd 1 cash
enter code here
DELIMITER $$
CREATE DEFINER=`ntc`@`%` PROCEDURE `spforallAgents`()
BEGIN
select
(select
@DayAmount:=sum(AmountRecevied) as Totoalamountperday
from
collection_master
where day(Date_Time) = day(CURRENT_DATE()) group by AgentID),
(select
@MonthAmount:=sum(AmountRecevied) as Totoalamountperday
from
collection_master
where date_time between DATE_FORMAT(NOW(), '%Y-%m-01') and LAST_DAY(now() - interval 0 month) group by AgentID),
(select
@YearAmount:=sum(AmountRecevied) as Totoalamountpermonth
from
collection_master where year(Date_Time) = YEAR(CURRENT_DATE()) group by AgentID),
(select
@Position:=@Position + 1 AS Rank
from
collection_master,
(SELECT @Position:=0) r group by AgentID) as position;
END
使用连接,您可以执行以下未经测试的操作:-
SELECT AgentID,
current_date_amount,
date_range_amount,
month_amount,
@Position:=@Position + 1 AS `Rank`
FROM
(
SELECT just_agent.AgentID,
total_current_date.Totoalamountperday AS current_date_amount,
total_date_range.Totoalamountperday AS date_range_amount,
total_month.Totoalamountpermonth AS month_amount
FROM
(
SELECT DISTINCT AgentID
FROM collection_master
) just_agent
LEFT OUTER JOIN
(
select AgentID, SUM(AmountRecevied) as Totoalamountperday
from collection_master
where day(Date_Time) = day(CURRENT_DATE())
group by AgentID
) total_current_date
ON just_agent.AgentID = total_current_date.AgentID
LEFT OUTER JOIN
(
select AgentID, sum(AmountRecevied) as Totoalamountperday
from collection_master
where date_time between DATE_FORMAT(NOW(), '%Y-%m-01') and LAST_DAY(now() - interval 0 month)
group by AgentID
) total_date_range
ON just_agent.AgentID = total_date_range.AgentID
LEFT OUTER JOIN
(
select AgentID, sum(AmountRecevied) as Totoalamountpermonth
from collection_master
where year(Date_Time) = YEAR(CURRENT_DATE())
group by AgentID
) total_month
ON just_agent.AgentID = total_month.AgentID
ORDER BY total_month.Totoalamountpermonth DESC
) Sub1
CROSS JOIN (SELECT @Position:=0) Sub2
请注意,这是在做一些假设。例如,您最初的查询没有明确指定我假设的排名下降到OALAMOUNTPERMONTH的顺序。另外,如果有另一个表提供代理ID,而不是使用额外的子查询来获取不同的AgentID,则会更简单
SQL fiddle for it:-
编辑
使用来自另一个线程的代码加入对自身的查询,M.Massias值得称赞
SELECT t2.*
FROM
(
SELECT AgentID,
current_date_amount,
date_range_amount,
month_amount,
@Position1:=@Position1 + 1 AS `Rank`
FROM
(
SELECT just_agent.AgentID,
total_current_date.Totoalamountperday AS current_date_amount,
total_date_range.Totoalamountperday AS date_range_amount,
total_month.Totoalamountpermonth AS month_amount
FROM
(
SELECT DISTINCT AgentID
FROM collection_master
) just_agent
LEFT OUTER JOIN
(
select AgentID, SUM(AmountRecevied) as Totoalamountperday
from collection_master
where day(Date_Time) = day(CURRENT_DATE())
group by AgentID
) total_current_date
ON just_agent.AgentID = total_current_date.AgentID
LEFT OUTER JOIN
(
select AgentID, sum(AmountRecevied) as Totoalamountperday
from collection_master
where date_time between DATE_FORMAT(NOW(), '%Y-%m-01') and LAST_DAY(now() - interval 0 month)
group by AgentID
) total_date_range
ON just_agent.AgentID = total_date_range.AgentID
LEFT OUTER JOIN
(
select AgentID, sum(AmountRecevied) as Totoalamountpermonth
from collection_master
where year(Date_Time) = YEAR(CURRENT_DATE())
group by AgentID
) total_month
ON just_agent.AgentID = total_month.AgentID
ORDER BY total_month.Totoalamountpermonth DESC
) Sub1
CROSS JOIN (SELECT @Position1:=0) Sub2
) t1
JOIN
(
SELECT AgentID,
current_date_amount,
date_range_amount,
month_amount,
@Position2:=@Position2 + 1 AS `Rank`
FROM
(
SELECT just_agent.AgentID,
total_current_date.Totoalamountperday AS current_date_amount,
total_date_range.Totoalamountperday AS date_range_amount,
total_month.Totoalamountpermonth AS month_amount
FROM
(
SELECT DISTINCT AgentID
FROM collection_master
) just_agent
LEFT OUTER JOIN
(
select AgentID, SUM(AmountRecevied) as Totoalamountperday
from collection_master
where day(Date_Time) = day(CURRENT_DATE())
group by AgentID
) total_current_date
ON just_agent.AgentID = total_current_date.AgentID
LEFT OUTER JOIN
(
select AgentID, sum(AmountRecevied) as Totoalamountperday
from collection_master
where date_time between DATE_FORMAT(NOW(), '%Y-%m-01') and LAST_DAY(now() - interval 0 month)
group by AgentID
) total_date_range
ON just_agent.AgentID = total_date_range.AgentID
LEFT OUTER JOIN
(
select AgentID, sum(AmountRecevied) as Totoalamountpermonth
from collection_master
where year(Date_Time) = YEAR(CURRENT_DATE())
group by AgentID
) total_month
ON just_agent.AgentID = total_month.AgentID
ORDER BY total_month.Totoalamountpermonth DESC
) Sub1
CROSS JOIN (SELECT @Position2:=0) Sub2
) t2
ON ABS(t1.`Rank` - t2.`Rank`) <= 1.5
WHERE t1.AgentID = 2
您的子查询似乎都没有按AgentID缩小结果范围,而只是按AgentID分组。因此,每个AgentId返回一条记录是的,但根据数据日金额为2条记录,月金额为3条记录,代理id为3条记录,因此如何检查null并将null或0分配给列o/p值?按要求执行。我将在稍后给出一个示例,仅针对单个表您正在使用子查询,但您可以从子查询中执行一个操作,并将它们连接在一起,而不是将它们放在主SELECT子句中。如果您发布带有一些示例数据的表声明,以及您希望该示例数据的结果,我可以玩得更多。错误代码:1054。“字段列表”中的未知列“total\u current\u date.ToToToAlaMountPerDay”尝试该选项。但是请发布表格布局等,所以我有机会测试它。错误代码:1054。“字段列表”中的未知列“just_agent.AgentID”,在SQL FIDLE中对其进行了快速测试。现在尝试上面的版本如果我选择agentID-2 ex他的排名仅为2我如何显示1、2和3条记录?即他的排名前和排名后记录