2013-08-02 71 views
-4

我要尋找一個解決以下幾點:SQL中是否有`if`語法?

  1. 進去的users表,找到誰列出了該網站上的項目的用戶。在此users表中,沒有關於拍賣的列。相反,它是(在accounts,這列名爲user)連接到accounts表的關鍵,所以我用這個來加入他們的行列:

    SELECT users.id ,accounts.user FROM users 
    LEFT JOIN accounts 
    ON users.id = accounts.user 
    WHERE accounts.user IS NOT NULL 
    
  2. 從這些ID(用戶已上市的拍賣品),我需要找到他們的賬戶餘額。這也在accounts表中。餘額包含在名爲operation_amount的列中。我還有另外一個名爲operation_type的專欄,它描述了用戶是否有積極或消極的平衡。例如,如果operation_type = 1,他有一個負餘額,而如果operation_type = 2,他有一個積極的餘額。

現在我有另一張名爲tmpinvoice的表,其中有一列叫做amount。這顯示了用戶需要向網站管理員支付多少費用。

鑑於此,我需要計算他必須支付多少錢。例如,如果用戶的餘額爲$ 200,則需要根據operation_type來檢查它是否爲負值或正值。

想象一下balance - fees = total,如200 - 0.25 = ?。在這種情況下,根據200是正數還是負數計算的金額會有所不同。

我希望這是一個更好的描述。

+2

模式會很好,它有點難以理解你想說什麼,從什麼減去0.25,或者將它加到什麼?操作量? –

+1

http://www.google.com/搜索?q = sql + if –

+0

我用ful編輯它l詳細信息 – ameldur

回答

0

這聽起來像你的語法想弄清楚用戶的總餘額是多少。例如,如果用戶的負餘額爲200,並且欠站點運營商的.50,那麼對於她欠下的總共-200.50,它將是-200.50。如果它是正式的,那麼該公司欠她的199.50就是200-0.50。我有沒有得到那個權利?您正在查找的主要部分是以下查詢中的CASE語句。該解決方案適用於SQL Server。許多其他數據庫具有相似的CASE語句語法,但是您可以在SQL Server上使用SQL Server上的SQL Fiddle鏈接。

我讓事情變得簡單,並假設每個用戶只有1個帳戶,每個用戶只有1個tmpinvoice。由於您在WHERE子句中指定了「帳戶」。用戶IS NOT NULL」我改變了左連接到內部連接,這將完成同樣的事情。

SELECT 
users.id, 
accounts.user_id, 
(CASE WHEN accounts.operation_type=1 THEN accounts.operation_amount * -1 ELSE accounts.operation_amount END) - tmpinvoice.amount AS total 
FROM users 
INNER JOIN accounts ON 
users.id = accounts.user_id 
LEFT JOIN tmpinvoice ON 
users.id = tmpinvoice.user_id 

如果每個用戶超過1個tmpinvoice你可以做到以下幾點。

SELECT 
users.id, 
accounts.user_id, 
MAX(CASE WHEN accounts.operation_type=1 THEN accounts.operation_amount * -1 ELSE accounts.operation_amount END) - SUM(COALESCE(tmpinvoice.amount,0.0)) AS total 
FROM users 
INNER JOIN accounts ON 
users.id = accounts.user_id 
LEFT JOIN tmpinvoice ON 
users.id = tmpinvoice.user_id 
GROUP BY 
users.id, 
accounts.user_id 

SQL Fiddle對於工作示例

+0

謝謝你能檢查這個嗎? http://stackoverflow.com/questions/18052032/how-to-sum-multiple-column-with-multiple-value – ameldur

+0

錯誤代碼:1064 您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第4行使用'MAX(CASE WHEN accounts.operation_type = 1 THEN accounts.operation_amount * -1 ELSE')附近的正確語法 – ameldur

+0

不確定錯誤是什麼,但這裏是一個SQL小提琴的MySQL 5.5.32。相同的選擇,但DDL是不同的,所以它至少適用於MySQL 5.5.32。也許你可以編輯你的文章,包括你使用的實際查詢。http://sqlfiddle.com /#!2/f8965/1另外,這個問題看起來與這個問題完全相同。 –

0

我不知道如果這是你想要的,但讓我試試:

SELECT [user], 
     account_balance + TotalAmount 
FROM accounts A 
     JOIN 
     (
      SELECT user, 
        SUM(amount) AS TotalAmount 
      FROM tmpinvoice 
     ) T 
     ON T.[user] = A.[user] 
+0

而那-0.25在diffirend表中我可以使用SUM嗎? SELECT CASE中的 ? – ameldur

+0

這取決於你需要什麼。我會建議在你的問題中提供「完整」的描述和一些樣本數據。比如說,我有兩個表格,並添加您對這個問題感興趣的列。然後爲每個表添加3或4行樣本數據。一件好事就是添加目標的可視化表示。正如你可以看到有很多我們會很高興幫助:) –

+0

好吧,我編輯我的問題白細節全部細節 – ameldur

0

Documentation for MSSQL IF

處理變量的數量和操作更容易閱讀。

IF @OperationType = 1 
BEGIN 
SET @Amount = @Amount - 0.25 
END 
ELSE 
BEGIN 
SET @Amount = @Amount + 0.25 
END 
0

是的,你可以在SQL if else做的,這裏是我使用的MySQL

SELECT IF(condition, true,false) from tbl 
0

也許你正在尋找case表達

select case 
     when opperation_type = 1 then opperation_amount - 0.25 
     when opperation_type = 2 then opperation_amount + 0.25 
     end 
from tab 
+0

請更改0到2,並簽署be +在第二種情況下,只是爲了反映問題。 –

+0

@jyparask我錯過了!謝謝! – Parado

+0

Nit:'CASE'是一個*表達式*,不是一個聲明。這就是爲什麼它可以包含在其他表達式和實際語句中。 – RBarryYoung