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 条件的主要内容,如果未能解决你的问题,请参考以下文章