2011-12-07 45 views
2

我做沿着這一行的SQL查詢的select聲明較小運算:有SUM()函數SQL上限

SELECT 
    (select sum(weighting) 
    from table1 
    where id = tablemain.id) * 
    (select sum(weighting) 
    from table2 
    where id = tablemain.id) as rating 
from 
    tablemain 

我的問題是,這些中的一個SUM值應該有一個上限8, 例如如果權重列的SUM達到10只宜乘8

有誰知道這如何能在select語句來完成的任何想法,或者如果它甚至是可行的?

感謝

+0

[獲取在SQL的最小的兩個值(可能重複http://stackoverflow.com/問題/ 1947753 /),[從多列中選擇最小值的最佳方式是什麼?](http://stackoverflow.com/questions/368351/),[SQL Server中是否有Max函數, Math.Max in .NET?](http://stackoverflow.com/questions/124417/)。 – outis

+0

添加了一個應該更快的替代方法,仍然使用CASE WHEN THEN但避免了兩個相關的子查詢。 – MatBailie

回答

4

您可以嘗試的情況下,聲明。我甚至會選擇CTE中的值來簡化代碼,但原理是一樣的。

SELECT 
    (select CASE WHEN sum(weighting) > 8 THEN 8 ELSE sum(weighting) END 
    from table1 
    where id = tablemain.id) * 
    (select CASE WHEN sum(weighting) > 8 THEN 8 ELSE sum(weighting) END 
    from table2 
    where id = tablemain.id) as rating 
from 
    tablemain 
1

注:由於Leon兄弟指出這一點,下面是不行的,因爲min只需要每http://msdn.microsoft.com/en-us/library/ms179916.aspx一個參數:

select min(8, sum(weighting)) ... 
+1

T-SQL中的MIN函數不需要2個參數 – Leons

+0

Doh!是的,同意:http://msdn.microsoft.com/en-us/library/ms179916.aspx。我將編輯未來。謝謝! –

1

請注意您的查詢。現在它將爲tablemain中的每一行執行2個相關的子查詢。另一種方法是使用連接和分組。在你的情況下測試哪個更快。

SELECT id, 
(CASE WHEN t1.w > 8 THEN 8 ELSE t1.w END) * 
(CASE WHEN t2.w > 8 THEN 8 ELSE t2.w END) rating 
FROM tablemain as t, (select id, sum(weighting) w from table1 group by id) as t1, (select id, sum(weighting) w from table2 group by id) as t2 
WHERE t.id = t1.id and t.id = t2.id 
+0

如果這些關係中的任何一個是1:many(這幾乎可以肯定考慮使用SUM),那麼這個查詢不提供與OP示例相同的功能。 (id,w)= {(1,3)(1,6)}& t2(id,w)= { 2)(1,1)}':SUM(t1.w)應該是9,你的得分是27. SUM(t2.w)應該是7,你的給出的是14. [所以,是的,小心你的查詢。] – MatBailie

+0

你是對的,這是我試圖超越自我的最後一刻編輯。糾正。 – soulcheck

+0

@Dems該死的,沒有注意到你的解決方案在本質上是相同的。有一個upvote! – soulcheck

1

一種替代,以避免相關子查詢,而不會引起大量的重複...

SELECT id, 
(CASE WHEN (t1.weight > 8) THEN 8 ELSE t1.weight END) * 
(CASE WHEN (t2.weight > 8) THEN 8 ELSE t2.weight END)    AS rating 
FROM 
    tablemain              AS t 
LEFT JOIN 
    (SELECT id, SUM(weighting) AS weight FROM table1 GROUP BY id) AS t1 
    ON t1.id = t.id 
LEFT JOIN 
    (SELECT id, SUM(weighting) AS weight FROM table2 GROUP BY id) AS t2 
    ON t2.id = t.id