2012-03-18 59 views
3

我有這個複雜(對我)的要求,並希望它的SQL查詢。這裏的交易:一個(稍微複雜的)SQL查詢?

  • 有一個名爲「費用」在Access文件中的表。
  • 該表格包含「類別」,「金額」,「付款人」和「IsShare」等字段。
  • 類別可以是天然氣,雜貨,家庭等...
  • 金額是費用的美元金額。
  • 付款人可以是我或我的兄弟(「我」或「兄弟」)。
  • IsShare可以是真或假。基本上,如果IsShare是真的,那麼費用分爲兩部分。否則,付款人付錢。

我需要一個SQL查詢來計算特定類別的所有費用。應當計算爲這樣:我已經支付的所有非共享項目(付款人=「我」和IsShare =假)的

  • 100%,所有共享的項目,I」的
  • 50% (Payer ='我'和IsShare = true),以及
  • 我兄弟支付的所有共享項目的50%(Payer ='Bro'AND IsShare = true)。

該查詢應返回所有這三項的總和。

到目前爲止,我有一個初步的查詢,但它返回不正確的結果。有人能幫我糾正嗎?

非常感謝。

return @"SELECT Sum(Amount) AS TotalAmount " + 
     "FROM Expenses " + 
     "WHERE Category = 'Groceries' " + 
     "AND Payer = 'Me' " + 
     "AND Share = false " + 
     "GROUP BY Category " + 
     "UNION " + 
     "SELECT 0.5 * Sum(Amount) AS TotalAmount " + 
     "FROM Expenses " + 
     "WHERE Category = 'Groceries' " + 
     "AND Payer = 'Me' " + 
     "AND Share = true " + 
     "GROUP BY Category " + 
     "UNION " + 
     "SELECT 0.5 * Sum(Amount) AS TotalAmount " + 
     "FROM Expenses " + 
     "WHERE Category = 'Groceries' " + 
     "AND Payer = 'Bro' " + 
     "AND Share = true "; 
     "GROUP BY Category"; 
+1

使用'UNION ALL',換一個。 – 2012-03-18 02:53:30

+0

這是什麼數據庫引擎,SQL Server? – Brettski 2012-03-18 02:59:07

+0

歡迎來到Stack Overflow Santa!我總是想提醒新用戶,提升和接受(複選標記)問題是表示讚賞的主要手段。如果您有任何問題,[常見問題]是一個很好的資源,尤其是[問] – 2012-03-18 03:03:36

回答

2

我不認爲UNION是你需要做的。這將傳遞一次數據並將這些值放在單獨的列中。您可能需要將0.5轉換爲特定類型,但我沒有機會運行這個。

SELECT 
    Category, 
    SUM(CASE WHEN Payer='me' AND NOT IsShare THEN Amount ELSE 0 END) as IPaid, 
    SUM(CASE WHEN Payer='me' AND IsShare THEN Amount * 0.5 ELSE 0 END) as SharedPay, 
    SUM(CASE WHEN Payer='bro' AND IsShare THEN Amount * 0.5 ELSE 0 END) as BrotherPay 
FROM Eexpenses 
WHERE Category = 'Groceries' 
GROUP BY Category 

的MS Access:

SELECT 
    Category, 
    SUM(IIF(Payer='me' AND NOT IsShare, Amount,0)) as IPaid, 
    SUM(IIF(Payer='me' AND IsShare, Amount * 0.5, 0)) as SharedPay, 
    SUM(IIF(Payer='bro' AND IsShare, Amount * 0.5, 0)) as BrotherPay 
FROM Eexpenses 
WHERE Category = 'Groceries' 
GROUP BY Category 

添加了三列在一起:

SELECT Category, IPaid, SharedPay, BrotherPay, IPay + SharedPay + BotherPay as Total 
FROM (
    SELECT 
     Category, 
     SUM(IIF(Payer='me' AND NOT IsShare, Amount,0)) as IPaid, 
     SUM(IIF(Payer='me' AND IsShare, Amount * 0.5, 0)) as SharedPay, 
     SUM(IIF(Payer='bro' AND IsShare, Amount * 0.5, 0)) as BrotherPay 
    FROM Eexpenses 
    WHERE Category = 'Groceries' 
    GROUP BY Category 
) as T1 
+2

這個問題被標記爲'access'。祝你好運,'CASE WHEN'。 – 2012-03-18 03:30:12

+0

謝謝@ ta.speot.is由於某種原因沒有看到該標籤。添加了Access版本。 – Brettski 2012-03-18 03:51:12

+0

謝謝你,Brettski。看起來非常好。我寫了一個抓取讀者[1],讀者[2]和讀者[3]的方法,將它們相加並返回它們的總和。但是有沒有辦法讓單個查詢來做到這一點? [編輯:可以使用UNION ALL完成,因爲ta.speot.is建議?] – Santa 2012-03-18 06:25:57