Sum
如何在 SQL 中幾列的 SUM 之間獲得一個 MAX()?
我需要在, ,
MAX()
之間進行選擇SUM(Math)``SUM(English)``SUM(Physics)
結果必須是:
19 | English
它永遠不會很漂亮,但這是一種嘗試:
select gt, case gt when math then 'Math' when physics then 'Physics' when english then 'English' end from ( select greatest(math, physics, english) as gt , math, english, physics from ( select sum(math) as math , sum(english) as english , sum(physics) as physics from scores ) )
如果您使用的是 SQL Server,這是一個使用
UNPIVOT
. 您可以使用 write aSELECT
為您提供值的單行結果SUM
,然後應用UNPIVOT
本質上將該行轉換為一列……然後從那裡您只需SELECT TOP 1...
這是一個範例,可為您提供所需的確切結果:
create table #Scores ( name nvarchar(255) , Math int , English int , Physics int ) insert #Scores (name, Math, English, Physics) values ('Pete',4,5,3) , ('Mark',5,5,4) , ('David',4,5,3) , ('Lisa',3,4,4); SELECT TOP 1 sup.SubjectName, sup.Score FROM (SELECT SUM(Math) AS Math, SUM(English) AS English, SUM(Physics) AS Physics FROM #Scores) s UNPIVOT (Score FOR SubjectName IN (Math, English, Physics)) sup ORDER BY sup.Score DESC
UNION ALL
其他一些答案通過執行單個SELECT...SUM()
語句來“手動取消透視”結果。但是,在這種情況下,您會看到每個表掃描一次SELECT...SUM()
(即,您手動取消透視的每列一次)。從性能的角度來看,使用
UNPIVOT
語法將比UNION ALL
方法更好地擴展。該UNION ALL
方法將為每個語句訪問一次表(在本例中為 3 次)。通過SUM
在單個 中獲取三個值SELECT
,SQL Server 將執行一次表掃描以獲取三個SUM
值,然後UNPIVOT
和SELECT TOP 1
是一個相對較小的 CPU 操作。