MySQL условно подсчитывая результаты - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть запрос, который возвращает количество записей нескольких разных типов, но теперь мне нужно дополнительно уточнить набор результатов. Мне любопытно, если есть элегантный способ объединить эти утверждения в одно утверждение. В основном, если столбец 2 имеет значение true, инкремент ND_true и если столбец 2 имеет значение false, вместо этого инкремент ND_false увеличивается.

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'

Ответы [ 3 ]

0 голосов
/ 01 ноября 2011

Одна альтернатива:

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
0 голосов
/ 01 ноября 2011

Ваш пример запроса, хотя краткое неясно ... вы сначала тестируете c1 = 'ND' (сравнение строк) И сравниваете с c.2 (подразумевается, что c.2 логично), затем другой if (c.2 = 'P '...) Я уверен, что вы сокращаете названия столбцов, но это не имеет смысла.Является ли c.2 логическим полем или строковым полем ... одно или другое.

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
      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'

Пример: данные

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

приведет к тому, что только 4 отмеченные строки будут запрошены с окончательным счетом

ND_True = 3
ND_False = 1
0 голосов
/ 01 ноября 2011

Эмм ...

select count(*) from `tablename` where [something something something]

Похоже, гораздо лучшая альтернатива тому, что вы делаете. Либо это, либо вы не очень четко объясняете, что вы делаете и что привело вас к решению, которое у вас есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...