Sum

如何在 SQL 中幾列的 SUM 之間獲得一個 MAX()?

  • April 15, 2016

我需要在, ,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值,然後UNPIVOTSELECT TOP 1是一個相對較小的 CPU 操作。

引用自:https://dba.stackexchange.com/questions/135318