Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL条件计数结果_Mysql_Sum - Fatal编程技术网

MySQL条件计数结果

MySQL条件计数结果,mysql,sum,Mysql,Sum,我有一个查询,它返回几种不同类型记录的计数,但我现在需要进一步限定结果集。我很好奇是否有一种优雅的方式将这些语句组合成一个语句。基本上,如果第2列为真,则增量ND_为真,如果第2列为假,则增量ND_为假 sum(if(c.1 = 'ND' and c.2 is true, if(c.2 = 'P', 1, 0), 0)) as 'ND_true' sum(if(c.1 = 'ND' and c.2 is false, if(c.2 = 'P', 1, 0), 0)) as 'ND_false'

我有一个查询,它返回几种不同类型记录的计数,但我现在需要进一步限定结果集。我很好奇是否有一种优雅的方式将这些语句组合成一个语句。基本上,如果第2列为真,则增量ND_为真,如果第2列为假,则增量ND_为假

sum(if(c.1 = 'ND' and c.2 is true, if(c.2 = 'P', 1, 0), 0)) as 'ND_true'
sum(if(c.1 = 'ND' and c.2 is false, if(c.2 = 'P', 1, 0), 0)) as 'ND_false'
Select ...
    , C.ND_True As ND_True
    , C.ND_False As ND_False
From ...
    Cross Join  (
                Select Sum( Case When C1.P = 1 Then 1 Else 0 End ) As ND_True
                    , Sum( Case When C1.P = 0 Then 1 Else 0 End ) As ND_False
                From SomeTable As C1
                Where C1.1 = 'ND'
                    And C1.P = 'P'
                Union All
                Select Z.Val, Z.Val
                From ( Select 0 As Val ) As Z
                Where Not Exists    (
                                    Select 1
                                    From SomeTable As C2
                                    Where C2.1 = 'ND'
                                        And C2.P = 'P'
                                    )
                ) As C

Select ...
    , C.ND_True As ND_True
    , C.ND_False As ND_False
From ...
    Cross Join  (
                Select Sum( Case When C1.P = 1 Then 1 Else 0 End ) As ND_True
                    , Sum( Case When C1.P = 0 Then 1 Else 0 End ) As ND_False
                From SomeTable As C1
                Where C1.1 = 'ND'
                    And C1.P = 'P'
                Union All
                Select Z.Val, Z.Val
                From ( Select 0 As Val ) As Z
                Where Not Exists    (
                                    Select 1
                                    From SomeTable As C2
                                    Where C2.1 = 'ND'
                                        And C2.P = 'P'
                                    )
                ) As C

看起来比你现在做的更好。要么就是你没有很清楚地解释你在做什么,是什么引导你找到了解决方案。

一种选择:

Select ...
    , C.ND_True As ND_True
    , C.ND_False As ND_False
From ...
    Cross Join  (
                Select Sum( Case When C1.P = 1 Then 1 Else 0 End ) As ND_True
                    , Sum( Case When C1.P = 0 Then 1 Else 0 End ) As ND_False
                From SomeTable As C1
                Where C1.1 = 'ND'
                    And C1.P = 'P'
                Union All
                Select Z.Val, Z.Val
                From ( Select 0 As Val ) As Z
                Where Not Exists    (
                                    Select 1
                                    From SomeTable As C2
                                    Where C2.1 = 'ND'
                                        And C2.P = 'P'
                                    )
                ) As C

您的查询示例虽然摘要不清楚。。。您首先测试c1='ND'(字符串比较)和c.2(意味着c.2是逻辑的),然后测试另一个if(c.2='P'…),我确定您是在缩写列名,但这没有意义。c.2是逻辑字段还是字符串字段。。。一个或另一个

Select ...
    , C.ND_True As ND_True
    , C.ND_False As ND_False
From ...
    Cross Join  (
                Select Sum( Case When C1.P = 1 Then 1 Else 0 End ) As ND_True
                    , Sum( Case When C1.P = 0 Then 1 Else 0 End ) As ND_False
                From SomeTable As C1
                Where C1.1 = 'ND'
                    And C1.P = 'P'
                Union All
                Select Z.Val, Z.Val
                From ( Select 0 As Val ) As Z
                Where Not Exists    (
                                    Select 1
                                    From SomeTable As C2
                                    Where C2.1 = 'ND'
                                        And C2.P = 'P'
                                    )
                ) As C
sum(if(c.1 = 'ND' and c.2 is true, if(c.2 = 'P', 1, 0), 0)) as 'ND_true'
sum(if(c.1 = 'ND' and c.2 is false, if(c.2 = 'P', 1, 0), 0)) as 'ND_false'
这是我想你要找的东西的简化版本。。在本例中,您关心的是c.1是“ND”,因此将其作为WHERE子句来限制从表中检索的内容。然后,不必在IF()子句测试中重新复制它。然后,只需输入“其他”条件,其中有c.2表达式。。。由于测试内容的子句是相同的,因此第2列和第3列将触发它们将计入的列

Select ...
    , C.ND_True As ND_True
    , C.ND_False As ND_False
From ...
    Cross Join  (
                Select Sum( Case When C1.P = 1 Then 1 Else 0 End ) As ND_True
                    , Sum( Case When C1.P = 0 Then 1 Else 0 End ) As ND_False
                From SomeTable As C1
                Where C1.1 = 'ND'
                    And C1.P = 'P'
                Union All
                Select Z.Val, Z.Val
                From ( Select 0 As Val ) As Z
                Where Not Exists    (
                                    Select 1
                                    From SomeTable As C2
                                    Where C2.1 = 'ND'
                                        And C2.P = 'P'
                                    )
                ) As C
select
      sum( if( c.2, 1, 0 )) as ND_True,
      sum( if( c.2, 0, 1 )) as ND_False
   from
      yourTable c
   where
      c.1 = 'ND'
例:数据

Select ...
    , C.ND_True As ND_True
    , C.ND_False As ND_False
From ...
    Cross Join  (
                Select Sum( Case When C1.P = 1 Then 1 Else 0 End ) As ND_True
                    , Sum( Case When C1.P = 0 Then 1 Else 0 End ) As ND_False
                From SomeTable As C1
                Where C1.1 = 'ND'
                    And C1.P = 'P'
                Union All
                Select Z.Val, Z.Val
                From ( Select 0 As Val ) As Z
                Where Not Exists    (
                                    Select 1
                                    From SomeTable As C2
                                    Where C2.1 = 'ND'
                                        And C2.P = 'P'
                                    )
                ) As C
col1     col2
AX       true
BC       true
ND       true     <-- this row
XY       false
ND       true     <-- this row
ND       false    <-- this row
AX       false
ND       true     <-- this row
当你说“single statement”时,你是指一个Select子句(但有多列),还是指将两列合并成一个表达式?