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

Откуда:
Сообщений: 10
Здравствуйте, возникла такая проблема.
Есть необходимость в запросе SQL 10 раз делать левое объединение. При

этом возникают строки различной длины. Например может получиться такая

ситуация: что у первой строки 3 первых поля не равны NULL, а остальные

семь равны; У второй строки 4 первых поля не равны NULL, а остальные 6

равны и так далее. Как сделать так чтобы выводились строки с

максимальным количеством непустых полей.

Заранее, благодарю.
11 окт 05, 15:56    [1958637]     Ответить | Цитировать Сообщить модератору
 Re: Строка максимальной длины  [new]
Брюлик
Member

Откуда:
Сообщений: 690
Lookup COALESCE function in the BOL
11 окт 05, 16:01    [1958669]     Ответить | Цитировать Сообщить модератору
 Re: Строка максимальной длины  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
чегой то не понятна задача
что за строки?
может пример поможет разобраться...
11 окт 05, 17:58    [1959176]     Ответить | Цитировать Сообщить модератору
 Re: Строка максимальной длины  [new]
phohack
Member

Откуда:
Сообщений: 10
Smirnov Anton
чегой то не понятна задача
что за строки?
может пример поможет разобраться...

При выполнении запроса получается результат типа.

Поле 1 Поле 2 Поле 3 Поле 4 Поле 5 Поле 6

Знач 1 Знач 2 Знач 3 Null Null Null
Знач 4 Знач 5 Null Null Null Null
Знач 6 Знач 7 Знач 8 Знач9 Null Null

Из этого результата нужно выбрать только строку 3.
12 окт 05, 09:23    [1960161]     Ответить | Цитировать Сообщить модератору
 Re: Строка максимальной длины  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
select top 1 Поле_1, Поле_2, Поле_3, Поле_4, Поле_5, Поле_6
	from TBL
	order by (case when Поле_1 is null then 0 else 1 end +
		case when Поле_2 is null then 0 else 1 end +
		case when Поле_3 is null then 0 else 1 end +
		case when Поле_4 is null then 0 else 1 end +
		case when Поле_5 is null then 0 else 1 end +
		case when Поле_6 is null then 0 else 1 end) desc
12 окт 05, 09:36    [1960206]     Ответить | Цитировать Сообщить модератору
 Re: Строка максимальной длины  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34236
Блог
>tpg Так только 1 строку выдаст, а автор топика просит много строк)
Что-то типа этого, для 3х столбцов
SELECT *
  FROM Table1 AS T1
  WHERE CASE
          WHEN T1.C1 IS NOT NULL THEN 1
          ELSE 0
        END + CASE
                WHEN T1.C2 IS NOT NULL THEN 1
                ELSE 0
              END + CASE
                      WHEN T1.C3 IS NOT NULL THEN 1
                      ELSE 0
                    END = (SELECT MAX(CASE
                                        WHEN C1 IS NOT NULL THEN 1
                                        ELSE 0
                                      END + CASE
                                              WHEN C2 IS NOT NULL THEN 1
                                              ELSE 0
                                            END + CASE
                                                    WHEN C3 IS NOT NULL THEN 1
                                                    ELSE 0
                                                  END)
                              FROM Table1 AS T2)
12 окт 05, 09:41    [1960227]     Ответить | Цитировать Сообщить модератору
 Re: Строка максимальной длины  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Критик
>tpg Так только 1 строку выдаст, а автор топика просит много строк)
Ну, тогда так (пардон проглядел):
select top 1
	with ties
	Поле_1, Поле_2, Поле_3, Поле_4, Поле_5, Поле_6
	from TBL
	order by (case when Поле_1 is null then 0 else 1 end +
		case when Поле_2 is null then 0 else 1 end +
		case when Поле_3 is null then 0 else 1 end +
		case when Поле_4 is null then 0 else 1 end +
		case when Поле_5 is null then 0 else 1 end +
		case when Поле_6 is null then 0 else 1 end) desc
12 окт 05, 09:48    [1960257]     Ответить | Цитировать Сообщить модератору
 Re: Строка максимальной длины  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3000
вероятно так

SELECT TOP 1 *, LEN(ISNULL(LEFT(Field1,1),'a')+ISNULL(LEFT(Field2,2),'a')+ISNULL(LEFT(Field3,1),'a')+...) AS T FROM MyTable ORDER BY T
12 окт 05, 09:48    [1960260]     Ответить | Цитировать Сообщить модератору
 Re: Строка максимальной длины  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3000
точнее так
SELECT *, 
  LEN(ISNULL(LEFT(Field1,1),'')+
     ISNULL(LEFT(Field2,2),'')+
     ISNULL(LEFT(Field3,1),'')+...) AS T 
FROM 
  MyTable ORDER BY T DESC

а уж отсюда можно вытащить строки с максимальным кол-вом не пустых значений
12 окт 05, 09:54    [1960278]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить