Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запросы Interbase/Firebird, MSSQL, MySQL и т.д.

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Господа форумчане, в частности программисты, предлагаю в етой ветке обмениваться опытом в создании
нестандартных запросов.
Лично мне приходилось задавать вопросы в других ветках, мне конечно помогали, но админы точат зубы,
шо не по теме вопросы
 
И по ходу подсобите с таким запросом
 
Table1 - мастер таблица
FIO
...
Table1_ID
 
Table2 детал таблица
Table1_ID,
Table3_ID,

Kolvo
........
Table2_ID
 
Table3 справочник наименований
Tovar_Type
Tovar_Name
.....
Table3_ID
 
Table4
Tovar_Type_Name
Tovar_Type может быть от 1 до 6
Table4_ID
 
Так вот надо составить запрос и разместить данные по горизонтали в зависимости от Tovar_Type
типа такой таблички
     |  Tovar_Type=1   |  Tovar_Type=2   |  ....  |  Tovar_Type=6   |
FIO|TovarName|Kolvo|TovarName|Kolvo|  ....   |TovarName|Kolvo|
 
 
 

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 14:10 24-11-2011 | Исправлено: ShIvADeSt, 16:18 24-11-2011
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MagistrAnatol
Тут я так понял динамическое количество столбцов? Вот здесь
http://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/
есть пример простого выполнения динамического запроса. Тебе нужно будет по циклу вначале сформировать тело запроса, а потом уже выполнить.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 16:25 24-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А где мой пост делся ?????
ShIvADeSt не кол-во столбцов статическое

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 10:33 25-11-2011
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MagistrAnatol
Ну тогда 5 штук UNION - по одному на каждый Tovar_Type

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 11:41 25-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
UNION
не подходит - на одно фио будет много строчек а нада одна
выкрутился  
select t1.fio,  
        max(case when p.produktid = 1 then p.produkt end) as Pr1,  
        sum(case when p.produktid = 1 and t3.isvkl = 0 then t3.kvo else 0 end) Pr1_vkl,  
        sum(case when p.produktid = 1 and t3.isvkl = 1 then t3.kvo else 0 end) Pr1_vikl,  
   
        max(case when p.produktid = 2 then p.produkt end) as Pr2,  
        sum(case when p.produktid = 2 and t3.isvkl = 0 then t3.kvo else 0 end) Pr2_vkl,  
        sum(case when p.produktid = 2 and t3.isvkl = 1 then t3.kvo else 0 end) Pr2_vikl,  
   
        max(case when p.produktid = 3 then p.produkt end) as Pr3,  
        sum(case when p.produktid = 3 and t3.isvkl = 0 then t3.kvo else 0 end) Pr3_vkl,  
        sum(case when p.produktid = 3 and t3.isvkl = 1 then t3.kvo else 0 end) Pr3_vikl  
   from produkt p  
        join table1 t1 on 1 = 1  
        left join table3 t3 on t3.produktid = p.produktid and t3.table1id = t1.table1id  
   group by 1

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 14:50 25-11-2011
maa78s

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет.
Подскажите, плиз, с иерархическим запросиком, а то что-то заблудился в 3 соснах
Есть 2 таблицы t_objects, t_params.
Нужно иерархически (вверх по дереву) поднять все объекты из t_objects и выбрать первый попавшийся объект, у которого есть ненулевой параметр в атрибуте attr_id из связанной таблицы t_params
 
Дереро объектов поднимаю как:
select o.object_id, o.name
from t_objects o
start with o.object_id = 1000
connect by o.object_id = prior o.parent_id;
 
таблицы связываются как t_objects.object_id = t_params.object_id
 
Как правильно в запросе указать эту связь и проверку на t_params.attr_id is not null и вытащить именно первый попавшийся такой объект?

Всего записей: 17 | Зарегистр. 10-07-2009 | Отправлено: 13:50 30-11-2011
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
maa78s
а что значит первый попавшийся?
обычно придерживаются какого либо порядка, хотя бы первичного ключа.
а что это за sql? Для одной записи обычно используют TOP 1 или FIRST1
 
Добавлено:
да и дерева я что-то здесь не наблюдаю в упор )

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 23:01 30-11-2011
maa78s

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а что значит первый попавшийся?

имеется в виду первый из списка o.object_id, у которого существует запись t_params.attr_id. Просто не все объекты дерева могут иметь значение t_params.attr_id, но последний из списка точно будет иметь.
 

Цитата:
да и дерева я что-то здесь не наблюдаю в упор )

Дерево объектов формируется connect by o.object_id = prior o.parent_id начиная с первого объекта start with o.object_id = 1000 и в конечном результате оно выстраивается как:
o.object_id = 1000 (as child) -> o.parent_id (as child) -> o.parent_id (as child) -> o.parent_id (as child) -> ... o.object_id as top object
 
Добавлено:
Сделал это следующим вложенным запросом:
SELECT
 q.object_id, q.name
FROM
 (SELECT
   o.object_id, o.name, o.show_order, p.value
  FROM
   t_params p,
   (SELECT object_id, name, level as show_order
    FROM t_objects
    START WITH object_id = 1000
    CONNECT BY object_id = PRIOR parent_id) o
  WHERE
   p.object_id = o.object_id
   AND p.attr_id = 55
   AND p.value is not NULL
  order by o.show_order) q
WHERE rownum = 1;

Всего записей: 17 | Зарегистр. 10-07-2009 | Отправлено: 11:12 01-12-2011 | Исправлено: maa78s, 12:35 01-12-2011
vavavol



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Скажите, есть ли функция в FB для перекодировки из utf8 в ansi

Всего записей: 181 | Зарегистр. 25-01-2006 | Отправлено: 17:50 18-07-2013
Wolfrm



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите собрать 3 поля в триггере
первое поле выбрать селектом? node по id из таблицы nodes
SELECT node FROM `nodes` WHERE id=new.id_node (id_node уникальный)
 
+ вторые 2 поля из этой таблицы
set new.NumFull = concat(SELECT node FROM `nodes` WHERE id=new.id_node, '/', DATE_FORMAT(new.Date,'%d%m%y'), '/', new.Number);
 
либо подскажите где почитать как правильно это реализовать
 
разобрался скобок не хватало:
set new.NumFull = concat((SELECT node FROM `nodes` WHERE id=new.id_node), '/', DATE_FORMAT(new.Date,'%d%m%y'), '/', new.Number);

Всего записей: 202 | Зарегистр. 24-03-2006 | Отправлено: 09:54 25-10-2013 | Исправлено: Wolfrm, 11:46 25-10-2013
Big17

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как вы друг-друга понимаете на каком языке написан код?..... PLSQL, T-SQL или т.д.....

Всего записей: 147 | Зарегистр. 30-09-2003 | Отправлено: 01:12 04-02-2014
FreePaul



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте!
Имеем базу MSSQL, в ней есть поле Adress.
В этом поле адреса вида:
1 вид: Приморский край,г. Уссурийск,ул. Комсомольская,д.17,кв. 1 (это адрес с квартирой)
2 вид: Приморский край,г. Уссурийск,ул. Комсомольская,д.19,к.2,кв.8(это адрес с корпусом и квартирой)
3 вид: Приморский край,г. Уссурийск,ул. Комсомольская,д.25 (это адрес без квартиры)
 
Задача: привести адреса к стандарту "9 запятых", требуемому КЛАДР.
(Индекс, Страна, Регион, Район, Город, Населенный пункт, Улица, Дом, Корпус, Квартира)
При этом, если адрес без корпуса и без квартиры, то в конце должно стоять 2 запятые, а если только без квартиры, то одна запятая.
Кроме того, в полях "Дом", "Квартира" не допускается использование НЕцифровых символов. Но это нестрого пока что.
 
Адреса принадлежат "домашнему региону", т.е. две запятых в начале я добавил, после "Приморский край" и "г. Уссурийск" по две запятых доже добавил, т.е. могу получить адрес:
1 вида: ",,Приморский край,,г. Уссурийск,,ул. Комсомольская,д.17,кв.1", а надо  
             ",,Приморский край,,г. Уссурийск,,ул. Комсомольская,17,,1"
 
2 вида: ",,Приморский край,,г. Уссурийск,,ул. Комсомольская,д.19,к.2,кв.8" а надо
             ",,Приморский край,,г. Уссурийск,,ул. Комсомольская,19,2,8"
 
3 вида: ",,Приморский край,,г. Уссурийск,,ул. Комсомольская,д.25,," а надо
              ",,Приморский край,,г. Уссурийск,,ул. Комсомольская,25,,"
 
Не могу никак разобраться с определением домов, корпусов и квартир. Буду рад, если поможете.
 
P.S. В SQL полный ноль. Только-только начинаю разбираться, так что не смейтесь пожалуйста, если вопрос показался идиотским.

----------
Восход Солнца - это хорошо для начала...

Всего записей: 932 | Зарегистр. 07-08-2002 | Отправлено: 08:50 24-02-2014 | Исправлено: FreePaul, 09:04 24-02-2014
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FreePaul
если корпус - это всегда 'к.', а квартира всегда 'кв.',
и символы 'кв.' и 'к.' кроме как в картирах и корпусах не встречаются, то можно
сделать очень просто:
пишешь ф-ию на t-sql, к-я  
- с помощью CHARINDEX проверяет, есть ли вхождения квартиры и корпуса в строке и запоминает позиции вхождений
- если есть только квартира, добаваляет перед позицией c квартирой запятую (см. SUBSTRING)
- если нет ни того ни другого добавляет к концу строки две запятых
- c помощью REPLACE заменяет 'кв.', 'к. ', 'д.'  (c пробелами на конце и без)  на пустые строки
 
если возможны более хитрые варианты, значит нужно более полно парсить строку,
ф-ий в t-sql для этого достаточно, см.
http://technet.microsoft.com/ru-ru/library/ms177545.aspx

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 17:21 24-02-2014 | Исправлено: A_V, 17:26 24-02-2014
FreePaul



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет, символы могут быть разными (у корпуса - "корп.", "корпус"; у квартиры - "кварт.", "комн.", "комната", "к.". И это только то, что я обнаружил...).
Буду смотреть Вашу ссылку. Спасибо.

Всего записей: 932 | Зарегистр. 07-08-2002 | Отправлено: 00:21 25-02-2014 | Исправлено: FreePaul, 00:22 25-02-2014
noisy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FreePaul
 
Я бы считал бил строку по запятым. смотрел сколько кусков и делал выводы с корпусом или нет
а дальше удалял в кусках лишнее, типа кв. д. ...

Всего записей: 983 | Зарегистр. 30-05-2002 | Отправлено: 16:35 25-02-2014
Big17

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FreePaul
Можно также использовать REPLACE многократно, чтобы "привести" варианты к единой форме

Всего записей: 147 | Зарегистр. 30-09-2003 | Отправлено: 00:27 28-02-2014
zealotfan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую всех! Вопрос следующий. БД Firebird 2.5. Есть 2 таблицы лицевых счетов(lic) и изменений управляющих компаний(power_sale). Нужно вывести управляющую компанию лицевого счета на дату. Делаю запрос вида  
select tt.sbit from power_sale tt
where tt.licschet=:licschet and
tt.dateon=(select max(t.dateon) from power_sale t where t.licschet=:licschet and t.dateon<=:dateon)
Как можно данную задачу решить проще и быстрее?

Всего записей: 234 | Зарегистр. 25-02-2016 | Отправлено: 20:40 26-02-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может быть, в power_sale добавить поле dateof , чтобы power_sale стала не таблицей изменений, а таблицей периодов. У активных сейчас компаний dateof будет null.
На вставку периода повесить триггер, обновляющий dateoff периода по тому же счёту из dateon новой записи.
Повесить составной индекс на dateon-dateoff
 
Поиск будет быстрым и элегантным...

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 20:23 27-02-2016
zealotfan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно  я неправильно написал в таблице power_sale 3 поля licschet, dateon, sbit...Есть еще вариант делать select first 1 order by dateon desc(выполняется в 2 раза быстрее) но возможно есть еще варианты....Индекс первичный(licschet,dateon),внешние на lichschet и sbit

Всего записей: 234 | Зарегистр. 25-02-2016 | Отправлено: 01:03 28-02-2016
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
...в таблице power_sale 3 поля licschet, dateon, sbit..

Я так и понял. И предлагаю добавить четвёртое.
Чтобы хранить не факт начала связи счёта с УК, а период. С датой начала и датой конца в одной записи.
Это позволит искать один раз, а не два, как у вас сейчас.
 

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 08:07 28-02-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запросы Interbase/Firebird, MSSQL, MySQL и т.д.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru