2012-03-18 61 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