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

Откуда:
Сообщений: 205
Есть некоторая таблица MyTable, в которой кроме прочих обычных есть ключевые поля LimitDate и LimitKind. Поле LimitDate - это дата. Поле LimitKind - текстовое поле, которое может содержать пустое значение '' или значения 'T0', 'T1' или 'T2'. Для конкретной даты в таблице могут присутствовать до 4-х записей, которые будут отличаться значением поля LimitKind.
Необходимо реализовать запрос, который бы для конкретной даты выделял бы только одну запись из всех присутствующих, по принципу:
если есть запись с LimitKind='T2', то берётся она
иначе если есть запись с LimitKind='T0', то берётся она
иначе берётся запись с LimitKind=''
Как реализовать такой запрос?
13 авг 15, 12:21    [18012352]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
pivot / case
13 авг 15, 12:22    [18012361]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Degun
Member

Откуда:
Сообщений: 205
Если можно, то хотелось бы видеть код
13 авг 15, 12:35    [18012454]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
iap
Member

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

версия сервера - ?
Напишите CREATE TABLE MyTable...
INSERT MyTable(<СписокПолей>) SELECT <СписокЗначений>;
И какой должен быть результат.
13 авг 15, 12:44    [18012538]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Jaffar
Member

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

какой еще нах... pivot

просто
select t.*
from (select row_number(partition by date order by case Limit  when 'a' then 1 when when 'B' then 2 else 3 end) NN,
                 t.* 
      from table ) t
where
               NN = 1
13 авг 15, 12:58    [18012659]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
iap
Member

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

какой еще нах... pivot

просто
select t.*
from (select row_number(partition by date order by case Limit  when 'a' then 1 when when 'B' then 2 else 3 end) NN,
                 t.* 
      from table ) t
where
               NN = 1
Где я писал голимое слово "PIVOT", а??
Возвращаю матюки обратно!

Просто ведите себя прилично.
13 авг 15, 13:01    [18012676]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Jaffar
Member

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


нижайше прошу ВАШЕГО прощения сударь.

конечно это не относится к вам.
Это относится к 2 посту и его автору Knyazev Alexey
13 авг 15, 13:10    [18012752]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Jaffar
Это относится к 2 посту и его автору Knyazev Alexey


1) да? и кто Вам дал право со мной так общаться? за это можно смело в БАН(!)
2) кто вам сказал, что подобную задачу нельзя решить через PIVOT?


iap
Просто ведите себя прилично.
13 авг 15, 13:15    [18012780]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Degun
Member

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

CREATE TABLE #MyTable(LimitDate DATETIME, LimitKind VARCHAR(3), Name VARCHAR(30))
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-01', '', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-02', '', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-03', '', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-04', 'T0', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-05', 'T0', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-06', 'T0', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-06', 'T1', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-06', 'T2', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-07', 'T0', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-07', 'T1', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-07', 'T2', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-08', 'T0', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-08', 'T1', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-08', 'T2', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-09', 'T0', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-09', 'T1', 'User1')
INSERT INTO #MyTable(LimitDate, LimitKind, Name)
VALUES ('2015-07-09', 'T2', 'User1')


Возвратить должен
LimitDate LimitKind Name
2015-07-01 User1
2015-07-02 User1
2015-07-03 User1
2015-07-04 T0 User1
2015-07-05 T0 User1
2015-07-06 T2 User1
2015-07-07 T2 User1
2015-07-08 T2 User1
2015-07-09 T2 User1
13 авг 15, 13:17    [18012798]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Degun
Member

Откуда:
Сообщений: 205

LimitDate LimitKind Name
2015-07-01 User1
2015-07-02 User1
2015-07-03 User1
2015-07-04 T0 User1
2015-07-05 T0 User1
2015-07-06 T2 User1
2015-07-07 T2 User1
2015-07-08 T2 User1
2015-07-09 T2 User1
13 авг 15, 13:20    [18012815]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20583
Degun
Необходимо реализовать запрос, который бы для конкретной даты выделял бы только одну запись из всех присутствующих, по принципу:
если есть запись с LimitKind='T2', то берётся она
иначе если есть запись с LimitKind='T0', то берётся она
иначе берётся запись с LimitKind=''
А если есть только одна запись, причём с LimitKind='T1' - не выводить для этой даты ничего, верно?
13 авг 15, 13:39    [18012934]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Akina
Degun
Необходимо реализовать запрос, который бы для конкретной даты выделял бы только одну запись из всех присутствующих, по принципу:
если есть запись с LimitKind='T2', то берётся она
иначе если есть запись с LimitKind='T0', то берётся она
иначе берётся запись с LimitKind=''
А если есть только одна запись, причём с LimitKind='T1' - не выводить для этой даты ничего, верно?
У него же есть "иначе берётся запись с LimitKind=''"
13 авг 15, 13:45    [18012968]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
iap
Akina
пропущено...
А если есть только одна запись, причём с LimitKind='T1' - не выводить для этой даты ничего, верно?
У него же есть "иначе берётся запись с LimitKind=''"
А вот если и LimitKind='' отсутствует, то - что? NULL?
13 авг 15, 13:46    [18012978]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20583
А разве я что-то другое спросил?
13 авг 15, 14:07    [18013076]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Degun
Member

Откуда:
Сообщений: 205
Akina,
В принципе, таких ситуаций быть не должно. Предположим тогда, что выводить что есть, т. е. запись с 'T1'


iap,
Если по дате присутствует только одна запись, то её и выводить. Если несколько, то по приоритету который и обозначил изначально
13 авг 15, 14:08    [18013082]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Degun
Member

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

В принципе ваш вариант подходит (исправил ошибки в синтаксисе). Спасибо.
select t.*
from (select row_number() over (partition by LimitDate order by case LimitKind  when 'T2' then 1 when 'T1' then 2 when 'T0' then 3 else 4 end) NN,
                 * 
      from #MyTable ) t
where
               NN = 1
13 авг 15, 14:19    [18013169]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Knyazev Alexey,

уважаемый - я ни в коем разе не хотел задеть ваше достоинство, просто PIVOT здесь не уместен.
Можно конечно и с его помощью решить, а можно компьютером гвозди забивать, кстати может получиться.

просто Вы все усложняете.
раз человек задает такой вопрос - значит он не только про PIVOT но и про все остальное плохо знает, а вы направляете его по неверной дорожке и вместо того чтобы предложить правильное решение (молоток) предлагаете ему забить гвоздь монитором и говорите что при определенной сноровке может получиться.
13 авг 15, 14:31    [18013274]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Jaffar
просто Вы все усложняете.

и чем на данных, которые тут ТС предложил, запрос с PIVOT усложнил?

select LimitDate
    , coalesce ( T2, T1, T0, [ ] ) as Name                        
from #MyTable t
pivot ( max(Name) for LimitKind in ( [ ],[T0],[T1],[T2] ) ) pv
13 авг 15, 14:38    [18013323]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Модератор: Jaffar, Knyazev Alexey - давайте вести себя хорошо. Меньше экспрессии и больше конструктива.
13 авг 15, 14:38    [18013327]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
stepanet
Member

Откуда:
Сообщений: 27
Очень похоже на выгрузку лимитов в квик :)
13 авг 15, 14:44    [18013377]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Degun
Member

Откуда:
Сообщений: 205
Так оно и есть
13 авг 15, 14:53    [18013445]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
stepanet
Member

Откуда:
Сообщений: 27
Degun
Так оно и есть


А почему так получается, что тип лимита Т0 имеет много значений LimitDate
По идее вы выгружаете остатки на конкретный день, получается
ТО конкретный день,
Т1 конкретный день + 1(раб.день)
Т2 конкретный день + 2(раб.дня)
Тх конкретный день + ближайшее будущее
13 авг 15, 15:14    [18013596]     Ответить | Цитировать Сообщить модератору
 Re: Реализовать запрос по двум полям  [new]
Degun
Member

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

Эта задача не совсем по выгрузке лимитов на текущий день. Мне для реализации одной задачи для конкретного клиента и бумаги по каждому дню нужно получить одну строку лимитов в T2. Но когда T2 ещё не было, тогда у записей в поле LimitKind стояло пустое значение.
13 авг 15, 15:22    [18013649]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить