2016-04-06 64 views
-2

我需要在存储过程中写一个查询,我错过了下面的循环部分,否则插入和选择都是正确的,请建议完成查询或替代建议。带循环的小查询?

内传递的参数是@日,@ sectn只有

SELECT Name FROM tblProductionEffcyDetails where [email protected] and section [email protected] 

我得到的名单(例如5名)

环路1:对于每一个名字,我需要做下面

循环2:

SELECT Tstdmin,TAvlbmin,@name=Name, @eid=Empid 
FROM tblProductionEffcyDetails 
WHERE (wDate = @date) AND (Section = @sectn) and Name = (1st name from the above query list) 

@TSH = Tstdmin(如果存在于数据库赋一个值rther值应该不会花)

@TAT+=TAvlbmin 

插入上述值到另一个表

INSERT INTO tblDailyReport (wdate, Section, Name, Empid, TAvlT, TstdH, DEfficiency) 
VALUES (@date,@sectn,@name,@eid,@TAT,@TSH,(@TSH/@TAT)) 

名称,EMPID从tblProductionEffcyDetails拍摄。

在loop2的上方,直到完成所有相同的名称,一旦完成,它将转到Loop1并完成所有名称。

tblProductionEffcyDetails有许多名称和重复名称,所以都需要在循环中。最后,每个名称(不重复)和总和细节将被插入到tblDailyReport。

前端〜C#Asp.Net

回答

0

看起来你可以做的是,在一个声明中,虽然你在tblDailyReport更多的列比你的值。

INSERT INTO tblDailyReport (wdate, Section, Name, Empid, TAvlT, TstdH, DEfficiency) 
SELECT 
    wdate, 
    Section, 
    Name, 
    @eid AS Empid, 
    SUM(Tstdmin) AS TAvlT, 
    SUM(TAvlbmin) AS TstdH, 
    <Not Sure What you want here> AS DEfficiency 
FROM tblProductionEffcyDetails 
WHERE wDate = @date AND Section = @sectn 
GROUP BY wdate, Section, Name 
+0

这个查询是针对sql标准的,并且只能在mysql中运行,如果通过sql模式的完整组是**不启用**。它在新版本的mysql中默认启用。 – Shadow

+0

@Shadow你是说当有一个group时,mysql不允许选择常量,或者在这种情况下是参数? – juharr

+0

@Shadow我读到的关于'ONLY_FULL_GROUP_BY'的信息越多,我越容易相信你错了,因为除了不是列的参数以外,我确实拥有组中选择的所有列,因此不受此规则约束。我也很不安,mysql实际上有一个模式,允许你选择不在组中的列。 – juharr

0

你并不需要为这个存储过程,你可以完成整个事情中使用insert ... select ...查询与联接和SUM()单查询:

insert into tblDailyReport (wdate, Section, Name, Empid, TAvlT, TstdH, DEfficiency) 
select wDate, Section, Name, empid, sum(TAvlbmin), sum(Tstdmin), sum(Tstdmin)/sum(TAvlbmin) 
from tblProductionEffcyDetails 
where [email protected] and section [email protected] 
group by wDate, Section, Name, empid 

我已经2点的假设:

  1. 你还没有透露你想怎么治疗empid,所以我按这个字段分组。您可能需要根据您的具体要求进行更改。

  2. 你还没有透露你想如何处理DEfficiency(它从插入查询完全丢失,所以它有一个语法错误),所以我按这个字段分组。您可能需要根据您的具体要求进行更改。

更新:

由于缺失述评在更新的问题作为@TSH/@TAT计算,就可以计算出这个字段作为sum(Tstdmin)/sum(TAvlbmin)(更新上面的查询)。

+0

OP将'@ eid'插入到'Empid'中,如果他们希望来自'tblProductionEffcyDetails'表或者仅仅是一个传入存储过程的值,并不是很清楚。 – juharr

+0

非常感谢我们几乎接近解决方案,我已编辑的问题,使其更容易理解和清除疑虑,请建议 –

+0

更新有关效率的答案。我还不清楚你想如何使用empid。我知道你从同一个表中获得所有其他值,但你似乎没有在总结计算中使用它,但是你在结果表中插入了它的值。但是,您现在有足够的信息来解决问题,所以请尝试自己完成查询。 – Shadow