【问题标题】:SQL - where condition for each columnSQL - 每列的 where 条件
【发布时间】:2011-08-31 05:04:19
【问题描述】:

这是一个一般的 SQL 问题,但如果你必须知道数据库是 Firebird。

我有这张表(简体):

用户数量类型 -------------------- 约翰 25 学分 约翰 20 借记卡 约翰 5 借记卡 约翰 15 学分 迈克 15 学分

我希望使用单个查询得到如下所示的结果:

用户贷记借记 -------------------- 约翰 40 25 迈克 15 空
Where credit = SUM(amount) WHERE type=credit
   and debit = SUM(amount) WHERE type=debit

基本上,我希望根据字段的 SUM(在本例中为数量)但在不同的条件下(在本例中为类型)在结果中包含多个字段。

提前感谢您的任何建议。

【问题讨论】:

    标签: sql firebird where-clause where firebird2.1


    【解决方案1】:

    我不确定 Firebird 是如何做到的,但你能做类似的事情吗:

    SELECT user, 
    sum(SELECT amount FROM table AS t2 WHERE t2.user = t1.user AND type="credit" ) AS credit, 
    sum(SELECT amount FROM table AS t3 WHERE t3.user = t1.user AND type="debit" ) AS debit
    FROM table AS t1
    GROUP BY user
    ORDER BY user
    

    我正在参考我认为 PostgreSQL 中的内容,以防万一帮助您找到所需的内容。

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT credit.user_name, credit.cre, debit.deb
        FROM (SELECT user_name, SUM(amount) cre FROM t WHERE TYPE = 'credit' GROUP BY user_name) credit
        LEFT OUTER JOIN (SELECT user_name, SUM(amount) deb
                           FROM t
                          WHERE TYPE = 'debit'
                          GROUP BY user_name) debit
          ON (credit.user_name = debit.user_name)
      

      【讨论】:

        【解决方案3】:

        标准 SQL 是:

        SELECT "user",
            SUM(CASE WHEN type='credit' then amount END) as Credit,
            SUM(CASE WHEN type='debit' then amount END) as Debit
        FROM
            "table"
        GROUP BY
            "user"
        

        【讨论】:

        • +1,尽管您需要引用 "user"(并匹配列声明的大小写)。 USER 是 CURRENT_USER 的 Firebird 同义词,它不会在当前编写的查询中给出完全期望的结果。 :)
        • @pilcrow:你当然是对的,但这不只是一个模板吗?如果您认为此查询应该立即可运行,您应该提到table 也必须被引用。 :)
        • @Andriy - 嘿,可能会发生疯狂的事情,人们可以使用保留字,我不妨修复它,以便它可以作为真正的查询运行。我假设type 没有保留?
        • @Damien:好像不是,根据this article。 (更新。但它仍然被认为是一个关键字。)
        • @Andriy,确实如此。然而,user 并不是到处都是保留字(至少是 MySQL 和 SQLite),就像 table 一样,在我看来,它是原始帖子中使用的实际列名。谢谢。
        猜你喜欢
        • 2023-03-07
        • 2016-11-05
        • 1970-01-01
        • 2010-09-26
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        • 2023-01-02
        • 2022-12-17
        相关资源
        最近更新 更多