Sql 使用两个不同的WHERE语句进行选择
我正在努力解决如何运行select查询,在该查询中,我同时检查两个不同的值,并希望它们位于不同的列中 我的表格示例:Sql 使用两个不同的WHERE语句进行选择,sql,postgresql,Sql,Postgresql,我正在努力解决如何运行select查询,在该查询中,我同时检查两个不同的值,并希望它们位于不同的列中 我的表格示例: ID | foreignID | value | accepted ---------------------------------- 1 | 1 | 5 | Y 2 | 1 | 2 | Y 3 | 1 | 4 | N 4 | 2 |
ID | foreignID | value | accepted
----------------------------------
1 | 1 | 5 | Y
2 | 1 | 2 | Y
3 | 1 | 4 | N
4 | 2 | 8 | Y
我想做的是这样的:
SELECT
foreignID,
SUM(value WHERE (accepted='Y')) AS sum1,
SUM(value WHERE (accepted='N')) AS sum2
FROM example
WHERE foreignID='1'
我的预期结果是:
foreignID | sum1 | sum2
------------------------
1 | 7 | 4
显然,上面的代码不起作用,它只是半个sudo代码来显示我想要的。本质上,我只想用一个异化的方法进行检查,然后从几个求和中得到结果,每个求和都需要自己的参数
有人知道实现这一目标的方法吗,或者类似的方法吗。我试过把它放到
foreignID | sum
1 | 7
1 | 4
。。。但那不是我真正想要的
我也看到了这似乎是在正确的轨道上,但再一次,这是使用联合,我不认为是理想的为我的例子
我可能错了,所以如果我错了,请证明我错了。我可能只是忽略了什么!感谢您提供的任何帮助。试试这个:
SELECT
foreignID,
SUM(CASE WHEN accepted = 'Y' THEN value ELSE 0 END) AS sum1,
SUM(CASE WHEN accepted = 'N' THEN value ELSE 0 END) AS sum2
FROM example
WHERE foreignID='1'
这比案例更具可读性: 将布尔值强制转换为整数将导致0或1。许多,如果不是大多数的话,语言都以同样的方式表达。我在四个方面进行了测试: C 蟒蛇
>>> 7 * True - 2 * False
7
Javascript
<script type="text/javascript">
document.write(7 * true - 2 * false);
</script>
PHP
postgresql没有GROUP BY吗?您正在寻找函数。如果Foreignd是整数/数字列,则使用Foreignd='1'是个坏主意1'是字符串,1是数字。您应该始终为常量使用正确的数据类型表示法。@a_horse_和_no_name是的,您在这一点上是正确的。我确实注意到了这一点,在写这篇文章的时候,我觉得这很奇怪,但为了保持一致性,我还是保留了它,因为它只是示例代码。我完全是个白痴,因为我忘了那里的CASE函数。为大家的帮助干杯。我不同意这种形式更具可读性。更少的字符通常更具可读性,但并非总是如此。我每天使用这么多不同的语言,以至于我记不起所有语言中关于布尔型转换的规则,有些甚至是不允许的操作!我宁愿把它明确地说出来,也不必每次都去查演员的行为。但如果这对你来说更具可读性,那么对你来说就更有力量了@我用四种顶级语言测试了你的顶级标签。如果java的行为与C不同,那么C和C++就不同了。这些有什么不同?你知道哪些主要语言不是这样的?我的意思是,除了愚蠢的SQL Server和MySQL之外,您的C示例是不正确的——Convert类与casting类不同。C中的inttrue是编译时错误,因为无法强制转换类型。我通常反对关于布尔值的任何强制转换,而更喜欢编写布尔值的等价物?1:0,因为这表明了我的意图。在某些系统中,尤其是较旧的C代码中,将TRUE定义为1,将FALSE定义为2并不少见。即使它在SQL中定义良好,我认为把布尔值作为整数是一个坏主意。我的两分钱,不是否决票或其他什么,这只是我的意见。@cdhowie我一定有世界上最糟糕的记忆之一,因为我总是要重新学习以前已经掌握的东西。我上面写的非常基本的C示例花了我几分钟的时间来编写,尽管仅在3个月前,我就完成了一个复杂asp.net/C应用程序的8个月的单独开发。从那时起,我做了一些不同的事情,但没有做C。所以,如果你喜欢它,我会尽可能明确地理解。我的意思是,在这种情况下,它是如此简单,我更喜欢短路径。但这又取决于每一个人。欢迎发表意见:
>>> 7 * True - 2 * False
7
<script type="text/javascript">
document.write(7 * true - 2 * false);
</script>
<?php
echo 7 * true - 2 * false;
?>
create table test(
id int ,
foreignid int,
value int,
accepted char(1)
)
INSERT INTO test values (1,1,5,'Y');
INSERT INTO test values (2,1,2,'Y');
INSERT INTO test values (3,1,4,'N');
INSERT INTO test values (4,2,8,'Y');
select
foreignid,
sum( case when accepted='Y' then value else 0 end) as sumY
,sum( case when accepted='N' then value else 0 end) as sumN
from test
group by foreignid;