选择两个不同的WHERE语句

时间:2013-04-10 19:28:31

标签: sql postgresql

我正在努力研究如何运行一个select查询,我在同一时间检查两个不同的值,并希望它们在单独的列中。

我的表格示例:

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中获取结果,每个SUM都需要自己的参数。

有谁知道可以实现这一目标的任何方式,或类似的东西。我已经尝试了将它放入......的UNION。

foreignID | sum
        1 |   7
        1 |   4

......但那并不是我追求的目标。

我也看到multiple select in one sql statement似乎在正确的轨道上,但是再次使用UNION,我觉得这不适合我的例子。

我可能在那里错了所以如果我是的话,请证明我错了。我可能会忽略一些东西!感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:3)

试试这个:

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'

答案 1 :(得分:1)

这比case

更具可读性
select
    foreignID,
    sum("value" * (accepted = 'Y')::int) sum1,
    sum("value" * (accepted = 'N')::int) sum2
from example
where foreignID = '1'

布尔值到整数的转换结果为0或1.许多(如果不是大多数)语言以相同的方式转换。我测试了四个:

C#

Console.WriteLine("{0} {1}", 
    7 * Convert.ToInt32(true) - 2 * Convert.ToInt32(false), 
    // Or shorter:
    7 * (true ? 1 : 0) - 2 * (false ? 1 : 0)
);

的Python

>>> 7 * True - 2 * False
7

的Javascript

<script type="text/javascript">
    document.write(7 * true - 2 * false);
</script>

PHP

<?php
echo 7 * true - 2 * false;
?>

答案 2 :(得分:1)

SQL fiddle

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;