Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2009, 10:54   #1
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию Из одной колонки сделать две

Есть табличка:

date value1
2009-08-01 | 1
2009-08-02 | 2
2009-08-03 | 3
2009-08-04 | 4
2009-08-05 | 5

Нужно чтобы запрос выдавал:

date value1 value2
2009-08-02 | 1 | 2
2009-08-03 | 2 | 3
2009-08-04 | 3 | 4
2009-08-05 | 4 | 5

А если для каких-то дат значение - NULL, то должен ставтиь последнее не-NULL значение:

date value1 value2
2009-08-02 | 1 | 2
2009-08-03 | 2 | 3
2009-08-04 | 3 | 4
2009-08-05 | 4 | 5
2009-08-06 |NULL| 5
2009-08-07 |NULL| 5
2009-08-08 | 5 | 8

Последний раз редактировалось acidcool; 24.08.2009 в 11:11.
acidcool вне форума Ответить с цитированием
Старый 24.08.2009, 12:40   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну и традиционный встречный вопрос - какая субд? версия?
soleil@mmc вне форума Ответить с цитированием
Старый 24.08.2009, 12:47   #3
acidcool
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 19
По умолчанию

Виноват... MySQL Server 5.0
acidcool вне форума Ответить с цитированием
Старый 24.08.2009, 13:31   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а в нем есть функи по типу row_number() или rownum?
чтобы можно было вывести порядковые номера каждой из строк?

если нет, то только через ХП

на этом ресурсе полистал доку и там где-то в примерах есть упоминание rec_id, но не факт что это то что нужно (может это просто пример квазитаблицы и квазиполя этой таблицы...)

но чота с последним пунктом, про нулловые значения, озадачили
такая фишка прокатит только если у вас доступны оконные функции типа lead() over()
но остается еще вопрос, какое значение писать во вторую колонку если будет случай когда данные с определенного места и до конца отсортированного набора имеют NULL?
т.е. для вашего примера для числа 2009-08-08 value1 = NULL

З.Ы.: кстати, приветствуются и другие мнения, особенно мускул-истов
может я не знаю каких фишек, которые они там наприкручивали!?

Последний раз редактировалось soleil@mmc; 24.08.2009 в 14:15.
soleil@mmc вне форума Ответить с цитированием
Старый 24.08.2009, 14:48   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

в db2 (не знаю, как в микрософтском) можно использовать подзапросы в списке выборки, типо

Код:
select 1, 2, 3, (select 1 from table1), (select 2 from table2)
from table1
а вообще, есть ли смысл делать через выборку? может проще в клиентском коде получить данные из третьей колонки (у тебя она отличается от второй на константу, к примеру)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.08.2009, 15:08   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
а вообще, есть ли смысл делать через выборку? может проще в клиентском коде получить данные из третьей колонки (у тебя она отличается от второй на константу, к примеру)
имхо это магия тестового примера
а в общем случае, данные точно другие и их очень много

прикинул тут вариант с подзапросом
получается так
Код:
with 
t as 
(select 860000 object_id, 1 value1 from dual union all
 select 860001, 2 from dual union all 
 select 860002, 3 from dual union all 
 select 860003, 4 from dual union all   
 select 860004, null from dual union all 
 select 860005, 8 from dual union all 
 select 860006, 9 from dual union all 
 select 860007, 12 from dual union all 
 select 860008, 22 from dual union all 
 select 860009, 52 from dual union all 
 select 860010, 65 from dual
    )
    
select
  t1.object_id, 
  t1.value1,
  (select t2.value1
   from t t2 
   where t2.object_id = (select min(object_id)
                         from t 
                         where t.object_id>t1.object_id
                           and t.value1 is not null)
   ) value2
from t t1
object_id замените на date

Последний раз редактировалось soleil@mmc; 24.08.2009 в 15:22.
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ListView добавление текста в две колонки Shouldercannon Общие вопросы Delphi 3 02.04.2010 21:18
Сделать одной формулой! ZORRO2005 Microsoft Office Excel 3 30.06.2009 11:30
Блоки div вместо td, как сделать две колонки одинаковой высоты? v.victoria12345 HTML и CSS 0 06.05.2009 18:05
Как сумму из одной ячейки разделить на две именных? Сан Саныч Microsoft Office Excel 14 20.12.2008 09:44
Как разделить число и текст в одной ячейки на две ячейки. neboskreb Microsoft Office Excel 2 15.04.2008 19:39