2011-09-23 48 views
-3

MAX不工作我有一個SQL查詢如預期甲骨文

SELECT spt.paymenttype, 
    MAX(nest.paytypetotal) total 
FROM sportpaymenttype spt 
INNER JOIN (SELECT spt.paymenttype, 
       SUM(sod.detailunitprice * sod.detailquantity) paytypetotal 
      FROM sportorderdetail sod 
      INNER JOIN sportorder so ON so.orderid = sod.orderid 
      INNER JOIN sportpaymenttype spt ON spt.paymenttype = so.paymenttype 
      GROUP BY spt.paymenttype) nest ON nest.paymenttype = spt.paymenttype 
GROUP BY spt.paymenttype; 

我希望它返回一行(因爲MAX功能),但是,它返回4行。我想出了一個很好的方法來正確地做到這一點,但我想知道爲什麼最大功能是這樣做的?

而且,這些都是結果,在這裏我只希望第一個

PAYMENTTYPE TOTAL 
Loan   8640.95 
Check   147.34 
Credit Card 479.93 
Cash   25.95 

我想知道是如果有一個更好的方式來做到這一點...

SELECT spt.paymenttype, 
    nest.paytypetotal total 
FROM sportpaymenttype spt 
INNER JOIN (SELECT spt.paymenttype, 
       SUM(sod.detailunitprice * sod.detailquantity) paytypetotal 
      FROM sportorderdetail sod 
      INNER JOIN sportorder so ON so.orderid = sod.orderid 
      INNER JOIN sportpaymenttype spt ON spt.paymenttype = so.paymenttype 
      GROUP BY spt.paymenttype) nest ON nest.paymenttype = spt.paymenttype 
WHERE nest.paytypetotal = (SELECT MAX(nest.paytypetotal) 
          FROM (SELECT spt.paymenttype, 
          SUM(sod.detailunitprice * sod.detailquantity) paytypetotal 
          FROM sportorderdetail sod 
          INNER JOIN sportorder so ON so.orderid = sod.orderid 
          INNER JOIN sportpaymenttype spt ON spt.paymenttype = so.paymenttype 
          GROUP BY spt.paymenttype) nest); 

謝謝。

+4

示例SQL的工作原理是:爲每個付款類型返回一行 –

+1

擺脫'SELECT'子句中的'spt.paymenttype',擺脫整個'GROUP BY'子句。瞧。 – NullUserException

回答

2

如果你做了MAX(spt.paymenttype)並刪除GROUP BY比它會工作,你想要的東西就表現,那是因爲你告訴甲骨文組由paymenttype

+0

謝謝,它按照你的說法工作,但我不明白爲什麼這個工作。 paymenttype是一個VARCHAR2,爲什麼MAX在它上面工作? – twmb

+0

@twmb因爲你可以比較文本字段。 – NullUserException

+0

@NullUserExceptionఠ_ఠ「當您在字符串中使用MAX()時,字符串按字母順序排列,其中」maximum「字符串位於列表底部,而」minimum「字符串位於列表頂部。」 所以它實際上並沒有做我想做的事情,但它通過偶然的方式獲得了正確的答案。好。 我會轉到另一種方式做這涉及嵌套的SELECT查詢兩次。 – twmb

0

MAX函數是一個聚合。當你使用一個GROUP BY(在你的情況,最後是「GROUP BY spt.paymenttype」)時,聚合適用於由GROUP BY生成的每個組,而不是整個結果集。您確實爲每種付款類型獲得了一個結果行,因爲GROUP BY應該在沒有過濾器的情況下執行。

爲了得到一個行,選擇你需要的單一支付方式,並在查詢的結尾處添加一個

HAVING spt.paymenttype = 'FOO' 

。如果您想要所有paytypetotal值中的最大值,可能最簡單(不一定是最好)將整個事物變爲子查詢,然後從中選擇最大的付款值。