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

Откуда:
Сообщений: 37
Здравствуйте.

Есть таблица вида:

--------------------------------
id | title | value
--------------------------------
1 | File1 | 100
2 | File2 | 100
3 | File3 | 100
4 | File1 | 52
5 | File3 | 37
--------------------------------

Передо мной встала задача получить список файлов с условием, что из списка должны выбираться все строки
с value = 100 и, если есть, строки с value = 52.
В случае, если у строк одинаковые title, в сортировке должна оставаться лишь строка с value = 52.

Подскажите, пожалуйста, как сделать это одним запросом?
7 ноя 12, 12:14    [13431931]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
JustNoob,
+ как вариант

declare @t table
  (
    id int
  , title varchar(50)
  , value int
  ) ;
insert  into @t
        ( id, title, value )
values  ( 1, 'File1', 100 )
,       ( 2, 'File2', 100 )
,       ( 3, 'File3', 100 )
,       ( 4, 'File1', 52 )
,       ( 5, 'File3', 37 )


select  case when t2.id is null then t.id
             else t2.id
        end as id
      , case when t2.id is null then t.title
             else t2.title
        end as title
      , case when t2.id is null then t.value
             else t2.value
        end as value
from    @t t
left outer join @t as t2 on t2.title = t.title
                            and t2.value = 52
where   t.value = 100

7 ноя 12, 12:26    [13432044]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT TOP(1) WITH TIES *
FROM [таблица вида]
WHERE [value] IN(52,100)
ORDER BY ROW_NUMBER()OVER(PARTITION BY title ORDER BY [value]);
7 ноя 12, 12:28    [13432059]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
iap
Member

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

вот только не совсем понятно: значение 52 проверяется только если у title есть 100 или всегда?
7 ноя 12, 12:32    [13432100]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
JustNoob
Member

Откуда:
Сообщений: 37
Извините, что не уточнил сразу, сервер - SQL2000.

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

Нужно получить список ВСЕХ файлов для всех городов (в примере с value = 100) и для конкретного города ОДНОВРЕМЕННО
(в примере value = 52, value = 37), но оставить лишь те, что для всех городов и те, что для конкретного города,
т.е. удалить из выборки файлы для всех городов, название которых совпадает с файлами для конкретного.

Структура таблицы немного сложнее, чем в примере, за что прошу прощения.

--------------------------------
id | title | hash | value
--------------------------------
1 | File1 | SDGF | 100
2 | File2 | ABCD | 100
3 | File3 | EGGH | 100
4 | File1 | NMKL | 52
5 | File3 | HCDE | 37
--------------------------------

Результатом выборки при указании города (пусть 52) должно быть:

--------------------------------
id | title | hash | value
--------------------------------
2 | File2 | ABCD | 100
3 | File3 | EGGH | 100
4 | File1 | NMKL | 52
--------------------------------
7 ноя 12, 13:14    [13432485]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
icprog
Member

Откуда:
Сообщений: 166
Так?
select distinct t1.id, t1.title, t1.value from #t t1, #t t2
 where (t1.value=100 or t1.value=52) and (t2.value=100 or t2.value=52)
 and t1.id>t2.id and t1.title<>t2.title


id title value
2 File2 100
3 File3 100
4 File1 52
7 ноя 12, 13:28    [13432620]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
JustNoob
Member

Откуда:
Сообщений: 37
icprog
Так?
select distinct t1.id, t1.title, t1.value from #t t1, #t t2
 where (t1.value=100 or t1.value=52) and (t2.value=100 or t2.value=52)
 and t1.id>t2.id and t1.title<>t2.title


id title value
2 File2 100
3 File3 100
4 File1 52


Не получается. Все равно выходят все строки (
7 ноя 12, 13:32    [13432686]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
JustNoob
Member

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

вот только не совсем понятно: значение 52 проверяется только если у title есть 100 или всегда?


Значение будет проверяться всегда. Если его нет, то запрос должен выдавать все строки с value = 100.
7 ноя 12, 13:34    [13432706]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
iap
Member

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

вот только не совсем понятно: значение 52 проверяется только если у title есть 100 или всегда?


Значение будет проверяться всегда. Если его нет, то запрос должен выдавать все строки с value = 100.
Я хотел уточнить, надо ли выбирать 52, если для этого title 100 не существует вовсе?
Однако, всё равно моё решение не годится, если сервер 2000-й
7 ноя 12, 13:53    [13432874]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
icprog
Member

Откуда:
Сообщений: 166
JustNoob,
Странно, проверил на 2000 сервере, возвращает те же 3 строки, а не все...
7 ноя 12, 14:01    [13432956]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
icprog
Member

Откуда:
Сообщений: 166
JustNoob
Значение будет проверяться всегда. Если его нет, то запрос должен выдавать все строки с value = 100.


А вот этот момент я не учел
7 ноя 12, 14:10    [13433036]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
JustNoob
Member

Откуда:
Сообщений: 37
iap
JustNoob
пропущено...


Значение будет проверяться всегда. Если его нет, то запрос должен выдавать все строки с value = 100.
Я хотел уточнить, надо ли выбирать 52, если для этого title 100 не существует вовсе?
Однако, всё равно моё решение не годится, если сервер 2000-й


Да, поскольку какой-то шаблон может быть только для конкретного города, т.е. 52 в примере.
7 ноя 12, 14:43    [13433285]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
icprog
Member

Откуда:
Сообщений: 166
еще один вариант, не очень красиво, но работает
select case when t2.id is null then t1.id else t2.id end, 
case when t2.title is null then t1.title else t2.title end,
case when t2.value is null then t1.value else t2.value end 
from 
(select id, title, value from #t
where value=100)t1 
left join
(select id, title, value from #t
where value=52)t2
on t1.title=t2.title
7 ноя 12, 14:51    [13433362]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
JustNoob
Member

Откуда:
Сообщений: 37
icprog
еще один вариант, не очень красиво, но работает
select case when t2.id is null then t1.id else t2.id end, 
case when t2.title is null then t1.title else t2.title end,
case when t2.value is null then t1.value else t2.value end 
from 
(select id, title, value from #t
where value=100)t1 
left join
(select id, title, value from #t
where value=52)t2
on t1.title=t2.title


Премного благодарен. Работает, как часики :)
7 ноя 12, 15:30    [13433760]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
JustNoob
Member

Откуда:
Сообщений: 37
Разве что для того, чтобы учитывались еще и файлы, которые есть только для города (52 в примере) необходимо поменять Left JOIN на FULL JOIN, тогда отрабатывает так, как представлялось :)

Еще раз спасибо большое.
7 ноя 12, 15:49    [13433949]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Добрый Э - Эх
Guest
Банальный group by + немного похулиганить в select-листе
7 ноя 12, 17:29    [13434888]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Добрый Э - Эх
Guest
как иллюстрация к вышесказанному мною:
--
-- Набор тестовых данных:
with
  t(id, title, hash, value) as
    (
      select 1, 'File1', 'SDGF', 100 union all
      select 2, 'File2', 'ABCD', 100 union all
      select 3, 'File3', 'EGGH', 100 union all
      select 4, 'File1', 'NMKL',  52 union all
      select 5, 'File3', 'HCDE',  37
    )
--
-- Основной запрос:
select substring(max(case value when 52 then '1' else '0' end + cast(id as varchar)),2,999) as id,
       title,
       substring(max(case value when 52 then '1' else '0' end + hash),2,999) as hash,
       substring(max(case value when 52 then '1' else '0' end + cast(value as varchar)),2,999) as value
  from t
 where value in (52, 100)
 group by title
 order by id
7 ноя 12, 18:12    [13435220]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Добрый Э - Эх
Guest
icprog
еще один вариант, не очень красиво, но работает
select case when t2.id is null then t1.id else t2.id end, 
case when t2.title is null then t1.title else t2.title end,
case when t2.value is null then t1.value else t2.value end 
from 
(select id, title, value from #t
where value=100)t1 
left join
(select id, title, value from #t
where value=52)t2
on t1.title=t2.title


Открой для себя встроенные функции (isnull или coalesce) по преобразованию null-значения во что-то неNULLевое:
Select isnull(null,1), isnull(2,1) union all
select coalesce(null,1), coalesce(2,1)
7 ноя 12, 18:19    [13435253]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
select title, min(value)
from [таблица]
group by title


select t.*
from [таблица] t
inner join
( select t1.title, min(t1.value) value
  from [таблица] t1
  group by t1.title
) subq
on t1.title=subq.title and t1.value=subq.value
7 ноя 12, 18:26    [13435307]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Добрый Э - Эх
Guest
denis2710
...
select  case when t2.id is null then t.id
             else t2.id
        end as id
      , case when t2.id is null then t.title
             else t2.title
        end as title
      , case when t2.id is null then t.value
             else t2.value
        end as value
...


И ты тоже открой для себя встроенные функции (isnull или coalesce) по преобразованию null-значения во что-то неNULLевое:
Select isnull(null,1), isnull(2,1) union all
select coalesce(null,1), coalesce(2,1)

7 ноя 12, 18:29    [13435323]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Добрый Э - Эх
Guest
Akina
select title, min(value)
from [таблица]
group by title


Не-а, так просто не отделаешься. Там ещё сопутствующие поля (ID, HASH) вытаскивать надо...
7 ноя 12, 18:30    [13435328]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Добрый Э - Эх
Guest
Akina
select t.*
from [таблица] t
inner join
( select t1.title, min(t1.value) value
  from [таблица] t1
  group by t1.title
) subq
on t1.title=subq.title and t1.value=subq.value

Ну, раз пошла такая пьянка, то приводи полный список решений задачи...
7 ноя 12, 18:33    [13435343]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Добрый Э - Эх
denis2710
...
select  case when t2.id is null then t.id
             else t2.id
        end as id
      , case when t2.id is null then t.title
             else t2.title
        end as title
      , case when t2.id is null then t.value
             else t2.value
        end as value
...


И ты тоже открой для себя встроенные функции (isnull или coalesce) по преобразованию null-значения во что-то неNULLевое:
Select isnull(null,1), isnull(2,1) union all
select coalesce(null,1), coalesce(2,1)


Ну Ё мое,а я то, 8 лет работаю с SQL Server и не знал .Спасибо гуру!!
8 ноя 12, 09:08    [13437473]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить