【问题标题】:A (slightly complex) SQL Query?一个(稍微复杂的)SQL 查询?
【发布时间】:2012-03-18 02:50:44
【问题描述】:

我有这个复杂的(对我而言)要求,并希望有一个 SQL 查询。这是交易:

  • Access 文件中有一个名为“Expenses”的表。
  • 该表包含“类别”、“金额”、“付款人”和“IsShare”等字段。
  • 类别可以是燃气、杂货、家庭等...
  • 金额是费用的美元金额。
  • 付款人可以是我或我的兄弟(“我”或“兄弟”)。
  • IsShare 可以为真或假。基本上,如果 IsShare 为真,则费用一分为二。否则,付款人将支付所有费用。

我需要一个 SQL 查询来计算特定类别的所有费用。应该这样计算:

  • 我已支付的所有非共享项目的 100%(Payer = 'Me' AND IsShare = false),
  • 我已支付的所有共享项目的 50%(Payer = 'Me' AND 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";

【问题讨论】:

  • 这是什么数据库引擎,SQL Server?
  • 我只想确认字段名称。首先你说它是 isShare,但在你的代码中你使用普通的 Share
  • 欢迎来到 Stack Overflow 圣诞老人!我总是想提醒新用户,赞成和接受(复选标记)问题是表达赞赏的主要方式。如果您有任何问题,FAQ 是一个很好的资源,尤其是How to Ask
  • 当然,除非他有一些名声,否则他不能投票 :)
  • 没错,我通常会在他们可以的时候把它放进去 :) 这是我的标准欢迎。

标签: sql ms-access select sum union


【解决方案1】:

我不认为你想要做的事情需要 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

【讨论】:

  • 这个问题被标记为access。祝你好运CASE WHEN
  • 感谢@ta.speot.is 由于某种原因没有看到该标签。添加了访问版本。
  • 谢谢你,布雷特斯基。看起来真的很好。我编写了一个获取 reader[1]、reader[2] 和 reader[3] 的方法,将它们相加,然后返回它们的总和。但是有没有办法让单个查询做到这一点? [编辑:可以使用 UNION ALL 来完成,如 ta.speot.is 提议的那样?]
  • 您可以在外部查询@Santa 中添加三列(字段)。
  • @Santa 的建议肯定会奏效。或者您可以在一列中重复所有三个 iif 语句,尽管这看起来很混乱并且重复代码。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多