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

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

foreignID | sum
        1 |   7
        1 |   4

...但这并不是我真正想要的。

我还在一个 sql 语句中看到了多项选择,这似乎是在正确的轨道上,但同样,这是使用 UNION,我认为这对于我的示例来说并不理想。

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

4

3 回答 3

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'
于 2013-04-10T19:30:00.973 回答
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;
?>
于 2013-04-10T19:33:24.430 回答
1

SQL小提琴

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;
于 2013-04-10T19:38:19.097 回答