Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
есть таблица tbTest
id
userId
active
другие поля

Запрос

select userId as user, count(userId) as active,  null as not_active from tbTest where active='true'
union
select userId as user, count(userId) as active,  count(userId) as not_active from tbTest where active='false'


В запросе дублируются строки, подскажите как это можна исправить

Есть
ФИО-----Активные-----Не активные
Петров-----5---------------2
Петров-----5---------------null
Сидоров----3---------------4
Сидоров----3---------------null

Должно быть
ФИО-----Активные-----Не активные
Петров-----5---------------2
Сидоров----3---------------4

Спасибо.
6 май 14, 12:06    [15978665]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
BOL - PIVOT или CASE. В зависимости от версии
6 май 14, 12:09    [15978690]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Glory,

Можете привести пример?
6 май 14, 12:15    [15978760]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx
6 май 14, 12:17    [15978787]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
SUM(case when active='true' then 1 else 0 end)
6 май 14, 12:18    [15978800]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Konst_One,

Есть маленький нюанс условия в запросах немножко отличаются(извините забыл написать) во втором запросе если документ не активен то нужно взять только за текущую дату, а если документ активен то даты не важны

select userId as user, count(userId) as active,  null as not_active from tbTest where active='true'
union
select userId as user, count(userId) as active,  count(userId) as not_active from tbTest where active='false' and closed = getdate()



Если сделать Так

select userId as user, sum(case when active='true' then 1 else 0 end),
null as closed from tbTest where active='true'
union
select userId as user, sum(case when active='true' then 1 else 0 end),
sum(case when active='false' then 1 else 0 end) as closed from tbTest where active='true' and closed = getdate()


Результат тот же с повторами(оператор union должен же исключить повторы?)

Подскажите как если это возможно исключить повторы?
6 май 14, 13:05    [15979211]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
VIT2708
Результат тот же с повторами(оператор union должен же исключить повторы?)

Повторы - это записи, в которых все поля одинаковы. А не часть полей

VIT2708
Подскажите как если это возможно исключить повторы?

А вы знаете, что в case when можно писать и сложные выражения ?
6 май 14, 13:07    [15979235]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Glory
VIT2708
Результат тот же с повторами(оператор union должен же исключить повторы?)

Повторы - это записи, в которых все поля одинаковы. А не часть полей

VIT2708
Подскажите как если это возможно исключить повторы?

А вы знаете, что в case when можно писать и сложные выражения ?


Я не могу понять как это мне поможет?, ведь мне по сути нужно давать 2 запроса
6 май 14, 13:14    [15979308]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
select userId as user
, count(case when active='true' then userId else null end) as active
, count(case when active='false' and cast(closed as date) = cast(getdate() as date)  then userId else null end) as not_active 
from tbTest 
group by userId
6 май 14, 13:15    [15979314]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
VIT2708
Я не могу понять как это мне поможет?, ведь мне по сути нужно давать 2 запроса

вы каким то чудесным образом знаете, чтот можно писать where active='true' and closed = getdate(), но не понимаете, как можно написать where when active='true' and closed = getdate() ?
6 май 14, 13:16    [15979328]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
LexusR,

спасибо!!!
6 май 14, 13:19    [15979352]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Glory,

да чего то думал что мне именно нужно все делать в where
6 май 14, 13:19    [15979358]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить