SQL - 每列的 where 条件

Posted

技术标签:

【中文标题】SQL - 每列的 where 条件【英文标题】:SQL - where condition for each column 【发布时间】: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(在本例中为数量)但在不同的条件下(在本例中为类型)在结果中包含多个字段。

提前感谢您的任何建议。

【问题讨论】:

【参考方案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 一样,在我看来,它是原始帖子中使用的实际列名。谢谢。

以上是关于SQL - 每列的 where 条件的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询where子句如果没有匹配记录则省略

带条件的 SQL 插入查询

如果使用 where 条件更改了列的数据类型,如何查找列的记录

mysql'WHERE'条件中的列号

如何更改SQL中某列的值

联合索引(x+y),那么sql语句的where条件上大于小于范围的哪种写法效率高?