Mysql 错误代码: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

这里我需要通过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 `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条记录?即他的排名前和排名后记录