2014-05-14 77 views
0

如何在多列中找到最大值。 這是我到目前爲止。在Sql中查找多個列的最大值

With Temp AS (
    SELECT P.ID AS 'Product_ID', 
      P.ProductCode AS 'Product_Code', 
      P.Name AS 'Product_Name', 
      P.SellPrice AS 'SellPrice', 
      P.SellPrice+(P.SellPrice*TVA/100) AS 'PricePerUnit', 
      P.TVA AS 'TVA', 
      P.Discount AS 'Discount_Product', 
      0 AS 'Discount_Code', 
      0 AS 'Discount_Newsletter', 
      V.ID AS 'Variant_ID', 
      V.Nume AS 'Variant_Name', 
      V.Stock-V.Reserved AS 'Quantity_MAX', 
      T.Quantity AS 'Quantity', 
      I.ImageName AS 'Image', 
      0 AS 'Is_Kit' 
    FROM TemporaryShoppingCart T 
    INNER JOIN ProductVariant V ON V.ID=T.Variant_ID 
    INNER JOIN Product P ON P.ID=V.ProductID 
    LEFT JOIN ProductImage I ON I.ProductID=P.ID AND DefaultImage=1 
    WHERE [email protected] AND T.Variant_ID!=0 

) SELECT t.* ,MAX(MAXValue) FROM (SELECT (T.Discount_Product) AS 'MAXValue' 
           UNION ALL 
           SELECT (T.Discount_Code) 
           UNION ALL 
           SELECT (T.Discount_Newsletter)) as 'maxval' //error 
    FROM Temp T 

此代碼是給我的錯誤:附近有語法錯誤MAXVAL「。

回答

4

你只是在尋找最好的?

SELECT 
    t.*, 
    GREATEST(T.Discount_Product, T.Discount_Code, T.Discount_Newsletter) as 'maxval' 
FROM Temp T; 

但是GREATEST當值爲NULL時返回NULL,所以您可能也想關心這一點。例如:

SELECT 
    t.*, 
    GREATEST 
    (
    coalesce(T.Discount_Product,0), 
    coalesce(T.Discount_Code, 0), 
    coalesce(T.Discount_Newsletter, 0) 
) as 'maxval' 
FROM Temp T; 

編輯:如果GREATEST在您的dbms中不可用,您可以使用大小寫表達式。

SELECT 
    t.*, 
    CASE 
    WHEN coalesce(T.Discount_Product, 0) > coalesce(T.Discount_Code, 0) 
    AND coalesce(T.Discount_Product, 0) > coalesce(T.Discount_Newsletter, 0) 
    THEN coalesce(T.Discount_Product, 0) 
    WHEN coalesce(T.Discount_Code, 0) > coalesce(T.Discount_Product, 0) 
    AND coalesce(T.Discount_Code, 0) > coalesce(T.Discount_Newsletter, 0) 
    THEN coalesce(T.Discount_Code, 0) 
    ELSE coalesce(T.Discount_Newsletter, 0) 
    END 
FROM Temp T; 

編輯:要想讓自己的語句在語法上是正確的,這樣做:

SELECT 
    t.*, 
    (
    select MAX(Value) 
    FROM 
    (
     SELECT T.Discount_Product AS Value 
     UNION ALL 
     SELECT T.Discount_Code 
     UNION ALL 
     SELECT T.Discount_Newsletter 
    ) dummy -- T-SQL requires a name for such sub-queries 
) as maxval 
FROM Temp T; 
+0

它不起作用。我收到錯誤:'最大'不是一個公認的內置函數名稱。 – POIR

+0

@Otix:太糟糕了。大多數dbms支持GREATEST。你用什麼dbms? –

+0

我正在使用SQL Server – POIR

1

您可能希望每個Select語句都有一個From子句。

+0

Hy Chrisky!你能更加明確嗎? – POIR

+0

他的意思是當你做選擇時,你需要一個從。因此,在上述問題中您的語法錯誤 –

0

SELECT MAX(GREATEST(col1col2col3col4col5col6col7col8col9col10col11,col12))作爲'MAXDATE'FROM table_name