2011-02-10 67 views
1

如果不能在我的MS SQL存储过程中使用数组,我无法计算出计算公式的有效方法。使用不同数量的输入在MS SQL Server中进行高效计算

背景....

select child_id, sum(quantity) as quantity 
    from table 
    where parent_id = @parent_id 

回报是这样的....

child_id  quantity 
100   50000 
200   60000 
300   45000 
400   30000 
500   15000 

这是一个简单的SQL公式来说明什么,我需要帮助。数学并不重要(好吧,如果它没有任何意义 - 它简化,以表明我需要如何使用从上面的总结量)...

set @result = (2 * LOG(50000)) + LOG(60000) + LOG(45000) + LOG(30000) + LOG(15000) 

对于上述每个child_id的,我想要执行一个(select child_id,@result)。请注意,“活动”child_id的总计数量与其他child_ids(2 * LOG())的总和数量不同。此外,child_id的计数在2到20之间变化。如果只有2个child_ids,则@result将为=(2 * LOG(50000)+ LOG(60000)。对于你可以提供的任何建议很多

+0

在上面的例子中,child_id 200的结果是什么? – 2011-02-10 16:47:29

+0

Matt,Joe,Martin - 谢谢。我必须再考虑一下,以确定CTE方法是否能用我的非简化算法工作(或如何工作)。 Matt,回答你的问题 - child_id 200的结果是=(2 * LOG(60000))+ LOG(50000)+ LOG(45000)+ LOG(30000)+ LOG(15000)。再次感谢你们。 – karman 2011-02-10 19:23:49

回答

1

假设至少SQL 2005为CTEs。我疯狂的方法是,我会得到所有日志值的单一总和,然后为每个孩子添加日志值实现总和的2 *(这个孩子的值)部分。

;with cteQuantity as (
    select child_id, sum(quantity) as quantity 
     from table 
     where parent_id = @parent_id 
     group by child_id 
), 
cteAllLogs as (
    select sum(log(quantity)) as log_sum 
     from cteQuantity 
) 
select q.child_id, log(q.quantity) + l.log_sum as result 
    from cteQuantity q 
     cross join cteAllLogs l 
+0

是的,我们正在思考。令人放心的是我们正在提供相同的答案:) @karman,Joe的CTE可能是更干净的方式,假设你没有与SQL Server 2000一起苦苦挣扎。 – 2011-02-10 17:03:15

1

嗯,这可能前往你在正确的方向,但我们可能需要更多一点的细节计算:

DROP TABLE #results 
CREATE TABLE #results (parent_id INTEGER, child_id INTEGER, quantity FLOAT) 
INSERT INTO #results VALUES (10, 100, 50000) 
INSERT INTO #results VALUES (10, 200, 60000) 
INSERT INTO #results VALUES (10, 300, 45000) 
INSERT INTO #results VALUES (10, 400, 30000) 
INSERT INTO #results VALUES (10, 500, 15000) 

SELECT 
    child_id, quantity, LOG(quantity) + (SELECT SUM(LOG(quantity)) FROM #results subquery WHERE #results.parent_id = subquery.parent_id) 
FROM 
    #results