2016-06-27 2 views
2

У меня есть таблица выглядит следующим образомМожно ли подсчитать определенный сценарий в SQL Server?

ID | I | II | III | IV | V | 
=============================== 
1 | 1 | 0 | NULL|NULL|NULL| 
2 |NULL|NULL|NULL | 0 | 1 | 
3 | 1 | 0 | 0 |NULL|NULL| 
4 |NULL|NULL|NULL |NULL| 1 | 
. .  . . . . 
. .  . . . . 
. .  . . . . 

Я использую SQL Server 2014.

Ищу подсчитать количество ID, который имеет сценарий, как # 1 и # 3. Есть ли запрос, который может это сделать? Благодаря!

+0

Что вы имеете в виде "сценарий, как # 1 и # 3"? Точно такие же значения во всех столбцах? – ZLK

+0

Я имею в виду, что я хочу рассчитать количество людей, у которых есть значения на определенном этапе, но заканчивается NULL. Как и # 1, он имеет значения на этапах I и II, но затем «NULL» на следующих этапах. Если определенный идентификатор начинается с «NULL», но заканчивается значением, меня это не волнует. С запросом, который вы предоставляете, нужно указать все возможности в запросе? В моей таблице могут быть некоторые данные, такие как следующие: ID | I | II | III | IV | V | 5 | NULL | NULL | 0 | 1 | NULL | 6 | 1 | 0 | 0 | 1 | NULL | , , , Мне было бы интересно №5, а не # 6 –

ответ

0

Я предполагаю, что когда вы пишете сценарий как # 1 и # 3 вы действительно означает, что вы хотите считать строки, имеющие значения, равные, что строка 1 или строка 3 имеет. Если это так, вы бы сделали что-то подобное.

select count(*) 
from YourTable 
where (I = 1 
     and II = 0 
     and III is null 
     and IV is null 
     and V is null) 
    or (I = 1 
     and II = 0 
     and III = 0 
     and IV is null 
     and V is null); 

В качестве альтернативы, можно упростить выше запрос немного к следующему виду:

select count(*) 
from YourTable 
where (I = 1 
     and II = 0 
     and (III = 0 or III is null) 
     and IV is null 
     and V is null); 

Возможно, что-то вроде этого является то, что вы ищете:

select * 
from YourTable 
where coalesce(I, II, III, IV, V) is not null; 

Или это :

select 
    ValidCnt = sum(case 
     when coalesce(I, II, III, IV, V) is not null then 1 
     else 0 
     end), 
    InvalidCnt = sum(case 
     when coalesce(I, II, III, IV, V) is null then 1 
     else 0 
     end) 
from YourTable; 
+0

Я имею в виду, что я хочу рассчитать количество людей, у которых есть значения на определенном этапе, но заканчивается NULL. Как и # 1, он имеет значения на этапах I и II, но затем «NULL» на следующих этапах. Если определенный идентификатор начинается с «NULL», но заканчивается значением, меня это не волнует. С запросом, который вы предоставляете, нужно указать все возможности в запросе? В моей таблице могут быть некоторые данные, такие как следующие: ID | I | II | III | IV | V | 5 | NULL | NULL | 0 | 1 | NULL | 6 | 1 | 0 | 0 | 1 | NULL | . . . Мне все равно # 5, а не # 6 –

+0

Если вам все равно, что что-то начинается с ненулевого значения. Другими словами, что-то должно иметь ненулевое значение в I для вас, чтобы заботиться, тогда я думаю, что вам нужно будет сделать что-то вроде этого: 'select count (*) from YourTable где I не пусто;' , – Yobik

+0

Мне все равно, что «заканчивается» с помощью NULL, но NULL не обязательно должен находиться в определенном столбце. –

0

SELECT COUNT (ID) FROM YourTabel WHERE ISNULL (I, -1)! = - 1

Desc: I - это ваше имя столбца &, где вы можете указать больше столбцов, где условие.

+0

Можете ли вы объяснить мне ISNULL (I, -1)! = - 1? Спасибо. –

+0

Это логически совпадает с 'select count (*) из YourTable, где I не null;', но не рекомендуется. – Yobik

+0

, когда вы сравниваете значение null в вашем случае, когда оно конвертирует каждую вещь в нуль, поэтому я использую значение ISNULL (I, -1) в качестве значения return -1 при столбце I = -1, а затем сравниваю ISNULL (I, -1) с -1, если он обнаружил, что Null возвращает -1, поэтому условие будет истинным, и оно не будет считаться –

0

Надеется, что это помогает,

CREATE TABLE Joe (ID INT , I int NULL, II int NULL, III int NULL, IV int NULL, V int NULL) 

INSERT INTO Joe VALUES (1, 1, 0, NULL, NULL, NULL) 
INSERT INTO Joe VALUES (2, NULL, NULL, NULL, 0, 1) 
INSERT INTO Joe VALUES (3, 1, 0, 0, NULL, NULL) 
INSERT INTO Joe VALUES (4, NULL, NULL, NULL, NULL, 1) 

-- SELECT * FROM Joe 

SELECT J.* FROM Joe J 
JOIN 
    (SELECT J.ID,Count(0) Counter FROM Joe J WHERE J.I IS NOT NULL 
    AND J.V IS NULL 
    GROUP BY J.Id) JoeCounts ON J.Id = JoeCounts.Id 
Смежные вопросы