MS SQL Server中的高效计算,具有不同数量的输入

时间:2011-02-10 16:36:04

标签: sql-server

如果无法在MS SQL存储过程中使用数组,我就无法找到计算公式的有效方法。

...背景

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_id(2 * LOG())的总和不同。此外,child_id的计数在2到20之间变化。如果只有2个child_id,则@result将=(2 * LOG(50000)+ LOG(60000)。

我希望这是有道理的。非常感谢您提出的任何建议。

2 个答案:

答案 0 :(得分:1)

假设CTEs至少有SQL 2005。我疯狂的方法是,我将获得所有日志值的一个总和,然后为每个子项添加日志值,以实现总和的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

答案 1 :(得分: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