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

Откуда: Санкт-Петербург
Сообщений: 33
Доброго времени суток!
Подскажите пожалуйста, как сделать выбор поля по условию. У меня 2 таблицы, в одной (AccountList) мэйлы работников и статус присутствия на работе, во второй (AlertSending) список в соответствии с которым осуществляется рассылка. Во второй таблице 2 столбца с id основного работника (AlertSending.AccountId) и с id заместителя (AlertSending.SecondAccountId). Необходимо получить список мэйлов на которые нужно рассылать сообщения учитывая статус работника в таблице AccountList.
Когда у основного статус "1" нормально работает, ставишь "0" должен брать заместителя из поля AlertSending.SecondAccountId, нет, выдает пустой результат.
Запрос:
SELECT AccountList.Email, AccountList.AccountId, AccountList.Status
FROM AccountList INNER JOIN
AlertSending ON
AccountList.AccountId = CASE WHEN AccountList.Status = 1 THEN AlertSending.AccountId
WHEN AccountList.Status = 0 THEN AlertSending.SecondAccountId END
23 янв 14, 20:29    [15459383]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Italianspb,

SELECT L.Email,L.AccountId,L.Status
FROM AccountList L
JOIN AlertSending S
  ON L.Status=1 AND L.AccountId=S.AccountId
  OR L.Status=0 AND L.AccountId=S.SecondAccountId;
23 янв 14, 20:41    [15459446]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
SERG1257
Member

Откуда:
Сообщений: 2876
сделайте два джойна (по AccountId и SecondAccountId) а потом разбирайтесь с результатом

SELECT AccountList.Email, AccountList.AccountId, AccountList.Status,
 CASE WHEN AccountList.Status = 1 THEN s1.AccountId 
      WHEN AccountList.Status = 0 THEN s2.SecondAccountId
  END 
FROM AccountList 
left JOIN AlertSending s1 ON AccountList.AccountId = s1.AccountId
left JOIN AlertSending s2 ON AccountList.AccountId = s2.SecondAccountId
23 янв 14, 20:57    [15459516]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
iap,

к сожалению, тот же результат. Когда статус 1, выбирает основного. Статус "0" - ничего не выдает. Не хочет он использовать второй столбец.
24 янв 14, 09:38    [15460885]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
SERG1257,

Тут какая-то проблема с условием.
CASE WHEN AccountList.Status = 1 THEN s1.AccountId 
      WHEN AccountList.Status = 0 THEN s2.SecondAccountId
  END 


Сначала выдает 1, когда работник отсутствует, он не ставит 1 у заместителя. Не выбирает он его(((
24 янв 14, 09:45    [15460914]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2567
Italianspb,

CASE
  WHEN ISNULL(AccountList.Status, 0) = 1 THEN s1.AccountId 
  ELSE s2.SecondAccountId
END 
24 янв 14, 10:22    [15461116]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
PaulYoung,

к сожалению проверка на ноль не помогает( Он не выбирает второе поле AlertSending.SecondAccountId

Может проблема в самих таблицах? Уже не знаю что думать( Вложил скрин таблиц и запроса.

К сообщению приложен файл. Размер - 124Kb
24 янв 14, 11:40    [15461585]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
Italianspb
( Вложил скрин таблиц и запроса.

Какой тип у поля Status то ?
24 янв 14, 11:43    [15461610]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
Glory,

bit. Пробовал nvarchar с проверкой по строке. Не помогает(
24 янв 14, 11:49    [15461672]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
Italianspb
bit.

Да ладно. У вас на скриншоте какие то False/True
24 янв 14, 11:52    [15461712]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Italianspb,

что вернёт
SELECT DISTINCT Status FROM AccountList.Status
??
24 янв 14, 11:54    [15461732]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Поправлю:
iap
Italianspb,

что вернёт
SELECT DISTINCT Status FROM AccountList

??
24 янв 14, 11:54    [15461743]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
iap,

две строки
0
1
24 янв 14, 12:00    [15461794]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Italianspb
iap,

две строки
0
1
Тогда я Вам правильно написал.
Разве что Вы сами перепутали смысл Status=0 и Status=1
24 янв 14, 12:03    [15461830]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
iap
Italianspb
iap,

две строки
0
1
Тогда я Вам правильно написал.
Разве что Вы сами перепутали смысл Status=0 и Status=1


Вы все правильно написали. На скриншоте скрин из ManagementStudio, она так отображает bit в режиме редактирования. Вот как отображается в режиме просмотра. Суть одна и та же.

К сообщению приложен файл. Размер - 22Kb
24 янв 14, 12:10    [15461902]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
o-o
Guest
declare @AccountList table (AccountId int, email varchar(100), status bit);
insert into @AccountList (AccountId, email, status)
values (1, 'mail1', 0), 
       (2, 'mail2', 1),
       (3, 'mail3', 1), 
       (4, 'mail4', 1), 
       (5, 'mail5', 0) 
 
declare @AlertSending table (id int, AccountId int, SecondAccountId int);
insert into @AlertSending (AccountId, SecondAccountId)
values (1, 2), 
       (2, 3),
       (5, 4)

select distinct coalesce(l2.email, l1.email) as mail   
from @AccountList l1 
     left join @AlertSending s 
           on l1.status = 0 and s.AccountId = l1.AccountId 
     left join @AccountList l2
           on s.SecondAccountId = l2.AccountId
------------

mail2
mail3
mail4
24 янв 14, 15:34    [15463499]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
Ребята, неужели никак не решить задачу?(((
24 янв 14, 16:05    [15463719]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Italianspb,

пока вы не начнете говорить правду - нет :((
Скриптыв создания таблиц + заливку тестовых данных +результат который хотите получить...в студию,иначе никак
24 янв 14, 16:08    [15463752]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
Italianspb
Ребята, неужели никак не решить задачу?(((

15463499 показали, что задача решена
24 янв 14, 16:09    [15463763]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
Glory
Italianspb
Ребята, неужели никак не решить задачу?(((

15463499 показали, что задача решена


К сожалению не решена. Попробуйте сами.

declare @AccountList table (AccountId int, email varchar(100), status bit)
insert into @AccountList (AccountId, email, status) values (1, 'mail1', 1)
insert into @AccountList (AccountId, email, status) values (2, 'mail2', 1)
insert into @AccountList (AccountId, email, status) values (3, 'mail3', 1)
insert into @AccountList (AccountId, email, status) values (4, 'mail4', 1)
insert into @AccountList (AccountId, email, status) values (5, 'mail5', 0) 
 
declare @AlertSending table (id int, AccountId int, SecondAccountId int);
insert into @AlertSending (AccountId, SecondAccountId) values (1, 2) 
insert into @AlertSending (AccountId, SecondAccountId) values (1, 3)
insert into @AlertSending (AccountId, SecondAccountId) values (1, 4)

select distinct coalesce(l2.email, l1.email) as mail   
from @AccountList l1 
     left join @AlertSending s 
           on l1.status = 0 and s.AccountId = l1.AccountId 
     left join @AccountList l2
           on s.SecondAccountId = l2.AccountId


Должен выдать:
mail1
Выдает:
mail1
mail2
mail3
mail4
mail5
24 янв 14, 17:17    [15464327]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
В последнем варианте посылает и основному и заместителю. А должен посылать только основному и в случае отсутствия его на месте, заместителю.
24 янв 14, 17:22    [15464355]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
Italianspb
Должен выдать:
mail1

Да что вы говорите !
А куда долджны "пропасть" остальные записи из @AccountList ?
24 янв 14, 17:25    [15464363]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
o-o
Guest
Italianspb,
почему это только mail1-то должно выдать?
раз у остальных статус 1, почему их не надо?
ну а для случая, когда "заместителя" нету, вот исправленное:
declare @AccountList table (AccountId int, email varchar(100), status bit)
insert into @AccountList (AccountId, email, status) values (1, 'mail1', 1)
insert into @AccountList (AccountId, email, status) values (2, 'mail2', 1)
insert into @AccountList (AccountId, email, status) values (3, 'mail3', 1)
insert into @AccountList (AccountId, email, status) values (4, 'mail4', 1)
insert into @AccountList (AccountId, email, status) values (5, 'mail5', 0) 
 
declare @AlertSending table (id int, AccountId int, SecondAccountId int);
insert into @AlertSending (AccountId, SecondAccountId) values (1, 2) 
insert into @AlertSending (AccountId, SecondAccountId) values (1, 3)
insert into @AlertSending (AccountId, SecondAccountId) values (1, 4)

select distinct coalesce(l2.email, l1.email) as mail 
from @AccountList l1 
     left join @AlertSending s 
           on l1.status = 0 and s.AccountId = l1.AccountId 
     left join @AccountList l2
           on s.SecondAccountId = l2.AccountId
where not (l1.status = 0 and l2.email is null)          
24 янв 14, 17:26    [15464367]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Italianspb
Member

Откуда: Санкт-Петербург
Сообщений: 33
o-o,

Ну задумка-то в том, чтобы рассылать на основании списка AlertSending. Кому указали рассылать, то чтобы и отправлялось. AccountList это просто список работников с адресами и статусами присутствий.
Последний вариант у меня выдал:
mail1
mail2
mail3
mail4
А по идее должно быть:
mail1
mail1
mail1

AlertSending
(1, 2)
(1, 3)
(1, 4)
Первый "на месте", значит замам не посылать, только первому. Если он отсутствует, то должно быть:
mail2
mail3
mail4
24 янв 14, 17:40    [15464432]     Ответить | Цитировать Сообщить модератору
 Re: Выбор поля по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
Italianspb
Первый "на месте", значит замам не посылать, только первому

Он "первый" потому, что у него ид=1 ? Или как ?
Чем он лучше ид=2 с тем же status=1 ?
24 янв 14, 17:48    [15464480]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить