2012-04-25 93 views
4

我正在为客户开发一个站点。它需要一种特殊的方式来创建一个计算。在表中,我必须创建具有相同“%End”的行组。需要意见:选择表中的行

Table

由于在开始时只是一个排,90%(日期2011年11月24日)你只是忽略它。 例如,我有选择的日期

行2011年11月26日 2011年11月28日 2011年11月29日

然后进行计算,后来选择的日期

2011年12月4日 月05 2011 December 06 2011

2011年12月07日和09年12月的日期行被忽略,因为在它们之前或之后没有相同百分比的行。

依此类推。

我很迷茫,如何做到这一点。我如何创建日期组来计算它们?有没有简单而有效的方法来做到这一点?

我的“资源”是PHP,jQuery和MySQL的

任何帮助表示赞赏,我又立刻陷入这种自周一。

编辑: 表的信息被取出由存储过程 EDIT2: 表必须开始和以90%

开始90%....任何值的最终percert结束.. 0.90%,结束

EDIT3:这是我的存储过程(也许它可以帮助更好地理解http://pastebin.com/cZM1j72u

解决我的问题,我可以使用PHP,Java脚本(jQuery的)或MySQL

这个想法是从2011年12月17日起开始使用口袋妖怪的价值,并从2012年12月14日开始减少。

价值将从12月14日加仑的价值中划分。 < ---这就是我要找的。

回答

0

喜欢的东西:

for(i=0; i<data.length-1; i++) { 
    arr = [] 
    while(data[i].end_value == data[i+1].end_value) { 
    arr.append(data[i].end_value) 
    i++; 
    } 
    arr.append(data[i+1].end_value) 
    if(arr.length > 1) 
    // Then you've found a group and do the calculation with the values in the array 
} 

调整任何你需要工作的语法;你可能想要做这个服务器端。

+0

您的代码泄漏全局。 – ThiefMaster 2012-04-25 21:25:32

3

你需要什么样的计算?我认为这是MySQL的基础。例如:

SELECT percent_end, SUM(cakes) as sumcakes 
FROM table 
GROUP BY percent_end 

这简直就是SUM的各个%_END的蛋糕。使用GROUP BY

如果您不需要%_END它只有一个记录:

SELECT percent_end, SUM(cakes) as sum_cakes, COUNT(date) as date_amount 
FROM table 
GROUP BY percent_end 
HAVING date_amount > 1 
+2

+1 I秒钟,GROUP BY子句是最简单的方法,将按给定的列名称进行分组,其中列中的所有值都是相同的。因此,使用SQL最容易实现基于相同价值百分比的计算。 – SimonDowdles 2012-04-25 21:33:34

+0

我试过你所拥有的东西,但它只返回一行。我需要一个以上来计算 – chepe263 2012-04-25 22:02:19

+0

@One Stuck Pixel感谢您的精心制作。我也错误了HAVING并修复了我的代码:) – tosin 2012-04-26 07:00:21

1

在阐述Tosins上面的回答,您可以避开计算单日期项按照一个类似的过程:

SELECT percent_end, SUM(cakes) as sum_cakes, COUNT(DISTINCT(date)) as date_amount 
FROM table 
WHERE date_amount > 1 
GROUP BY percent_end 

在这种情况下,除非有两个或多个不同的日期范围,否则不会返回记录。但是,如果您需要更复杂的日期比较函数,那么SQL将开始看起来非常复杂。如果您需要检查 - 例如 - 如果在相同比例的记录之前或之后的日期是“x”天之前或“x”天之后,那将是一个全新的球赛。在计算更复杂的情况下,我会亲自动手处理PHP数组并执行各种排序和省略功能。许多人可能不同意我的看法,但我发现有时候你会花费数天的时间来制作一些麻烦的SQL查询,看起来像是来自火星。

*编辑*我刚刚意识到一个可怕的错误,我的上面的例子!当然,它不会工作,我在我的where子句中使用了date_amount,而date_amount是一个AS字段,换句话说不是实际的列名。由于SQL从内到外进行评估,因此在AS子句之前会出现WHERE子句,因此会引发错误并告诉您date_amount不存在。对于那个很抱歉。我纯粹为了帮助某人而离开它。然而

一个可以改变SQL和使用HAVING子句中得到相同的预期效果:

SELECT percent_end, SUM(cakes) as sum_cakes, COUNT(DISTINCT(date)) as date_amount 
FROM table 
GROUP BY percent_end 
HAVING date_amount > 1 
+0

当我说singel日期条目,我的意思是具有相同确切日期的条目。为什么你想要,我不知道,但出于某种原因,你似乎在你的问题中有一些非常奇怪的日期计算要求 – SimonDowdles 2012-04-25 21:53:37