Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» SQL запрос

Автор: snike555
Дата сообщения: 18.03.2010 07:58
SerBUser
dneprcomp
UNION ALL нужен, так как просто UNION возможно ещё как-то отсортирует записи + автор не говорил что нужно бы убрать повторяющиеся записи.
Автор: greenpc
Дата сообщения: 19.03.2010 13:37
snike555

Цитата:
просто UNION возможно ещё как-то отсортирует записи

расмешил
Автор: snike555
Дата сообщения: 19.03.2010 13:41
greenpc
Ничего смешного, сам можешь убедиться, во всяком случае у меня такое было.
Автор: greenpc
Дата сообщения: 19.03.2010 13:51
snike555
да пожалуйста, думаешь говорю голословно?
_http://www.sql-tutorial.com/sql-union-sql-tutorial/

Цитата:
with table1 as
Select 2,5 from dual union all
Select 6,9 from dual union all
Select 9,89 from dual),
table2 as
Select 2,5 from dual union all
Select 6,9 from dual union all
Select 9,89 from dual union all
Select 1,1 from dual)
select * from table1 union all select * from table2


Код: 2,5
6,9
9,89
2,5
6,9
9,89
1,1
Автор: Wahnsinn
Дата сообщения: 19.03.2010 15:14
как отсортировать по текстовому полю, чтобы в случае числовых полей они сортировались в порядке их значений, а не как текст, к примеру 2,3, n001, 23 будут в обычной ситуации идти как n001, 2, 23,3 а хотелось бы n001, 2, 3, 23
Автор: greenpc
Дата сообщения: 19.03.2010 15:45
Wahnsinn
скажите хоть какая база.
для оракла dbms_session.set_nls('NLS_SORT','BINARY');
либо так

Код: with
t as (
select '2' str from dual union all
select '3' from dual union all
select 'n001' from dual union all
select '23' from dual
)

select
str,
to_number(translate(str, abcdefghijklmnopqrstuvwxyz', '1234567890')) sOrder
from t
order by sOrder
Автор: Wahnsinn
Дата сообщения: 19.03.2010 15:59
Да это оракл, спасибо за информацию.
Автор: snike555
Дата сообщения: 19.03.2010 17:31
greenpc
Да пожалуйста:

Код: with table1 as
(Select 2,5 from dual union all
Select 6,9 from dual union all
Select 9,89 from dual),
table2 as
(Select 2,5 from dual union all
Select 6,9 from dual union all
Select 9,89 from dual union all
Select 1,1 from dual)
select * from table1 union select * from table2
Автор: Wahnsinn
Дата сообщения: 19.03.2010 18:06
greenpc
глянул сейчас в pl/sql developer запрос

Код:
ALTER SESSION SET NLS_SORT = BINARY;
select inv_no from delivery order by INV_NO;
Автор: greenpc
Дата сообщения: 22.03.2010 09:37
snike555
сорри ступил. думал о union all.
у union идет SORT UNIQUE
Автор: snike555
Дата сообщения: 26.03.2010 14:28
Помогите создать запрос, который бы вывел данные в таком виде:

a b ID
___________________________
20.01.2010
21.01.2010    
     21.01.2010 435
22.01.2010
     22.01.2010 3456
23.01.2010
24.01.2010    
     24.01.2010 675
25.01.2010
     25.01.2010 5464
     25.01.2010 756
     25.01.2010 4564
     25.01.2010 4563
26.01.2010    
27.01.2010
28.01.2010    
     28.01.2010 5466
29.01.2010    
30.01.2010    

то есть в левой колонке период дат последовательно идет, в правой на следующей строке данные из таблицы на соответствующую дату слева

Добавлено:
oracle 9i
Автор: volser
Дата сообщения: 26.03.2010 15:02
snike555
Это нужно делать не на сервере а на клиенте. А так можно через процедуру.
Автор: Pleshey
Дата сообщения: 27.03.2010 18:50
snike555
Запрос, я полагаю, можно сделать, только вот на а надо ограничения наложить
1 первый день
2 количество дней(включая первый и последний дни диапазона), или последний день.
3 максимально допустимое количество дней в диапазоне 1-2

Параметры 1 и 2, я так полагаю изменяемые и будут подставлятся в строку запроса. Остальное может сделать сервер.
В принципе, можно обойтись без 3 - зависит от того в какой среде будет генерится запрос, ну и других соображений.

Как вариант решения

select case when ID is null then a else null end as a,
case when ID is null then null else a end as b,
ID
from (
select num, Добавить_к_дате(StartDate , num -1, дней) <<-- формируешь последовательно даты>> as a
from( select num from Numerator where num <= days) snum
left join (
select b, ID from bID
union all
select distinct b, Null as ID from bID
) t
on snum.a=t.b
) t order by num, b

здесь Numerator - таблица с последовательностью чисел, начиная с 1, перекрывающих необходимый тебе диапазон. days - количество дней в выбранном диапазоне. StartDate - первый день диапазона - здесь также нужна функция типа Добавить_к_дате(StartDate , num -1, дней), которая будет прибавлять в первому дню диапазона номера из таблицы, таким образом создашь непрерывный диапазон дней в заданном диапазоне. oraclе не юзаю, сам подберешь нужную.
Проверить запрос возможности не было, надеюсь грубых ошибок нет, мелкие сам поправишь.
Numerator можно сгенерить на лету - ну не знаю, учитывая, что тут рекомендуется сортировка по полю этой таблицы, может стоит ее создать с соответствующим индексом. да и для других запросов может пригодиться

Оптимизацией не занимался - написал так, что бы запрос легко читался.
Автор: greenpc
Дата сообщения: 29.03.2010 12:19
snike555
если не критично +1 столбец

Код: with
t as (
select '01.01.2000' dt, 1 id from dual union all
select '01.01.2000', 2 id from dual union all
select '02.01.2000', 3 id from dual union all
select '03.01.2000', 3 id from dual union all
select '03.01.2000', 4 id from dual union all
select '04.01.2000', 5 id from dual
)
select dt a, null b, null id, dt c from t
union
select null a, dt as b, id, dt c from t
order by c , b desc
Автор: snike555
Дата сообщения: 29.03.2010 13:25
greenpc
Pleshey
Спасибо, разобрался, сделал как посоветовали тут http://www.sql.ru/forum/actualthread.aspx?tid=746003
Автор: Omsk
Дата сообщения: 05.05.2010 13:12
У меня база данных Firebird, я хочу занести запись в базу данных, клиент FlameRobin Database admin, пишу так:

Код: insert into FRIENDS
values ('Андрей', 79274091728, 'Андрей с моей улицы');
Автор: volser
Дата сообщения: 05.05.2010 13:28
Omsk
Число 79274091728 не влазит в integer.
Автор: Omsk
Дата сообщения: 05.05.2010 13:37
какой тогда тип данных писать туда, чтобы влез 11-значный номер сотовго оператора с дефисами?
Автор: volser
Дата сообщения: 05.05.2010 14:01
Omsk
Нужно использовать тип char или varchar.
Автор: Keiichi
Дата сообщения: 21.05.2010 14:54
Здравствуйте!

Подскажите пожалуйста каким образом можно найти, в какой таблице в каком столбце и строчке хранится необходимая информация?
известно лишь, что именно должно быть написано.

Дело в том, что есть готовое веб-приложение, сделанное до меня.
соответственно есть и БД MSSQL 2000.
В веб приложении заносились данные, которые успешно хранятся в БД.
Но с не давнего времени необходимо создать запрос на эти данные, для сбора статистики. И проблема в том, что я не могу найти где это хранится... таблиц очень много.

Пытался придумать скрипт поиск с перебором последовательным всех таблиц и столбцов, но не смог реализовать.
Кто-нибудь может помочь, или направить в нужном направлении?

Заранее огромное спасибо!
Автор: mdid
Дата сообщения: 21.05.2010 15:35
Keiichi
используйте profiler для получения имени таблицы...а потом запросом
Автор: chel78
Дата сообщения: 08.06.2010 18:49
Привет, у меня такое вот дело.
есть SQL запрос

Код:
SELECT
SYSDTL.SHIPID,
SYSTRN.TRNQTY,
SYSTRN.SYSDAT,
CUSTMR.CSTNAM
FROM
SYSDTL
Inner Join SYSTRN ON SYSTRN.TRNSEQ = SYSDTL.TRNSEQ
Inner Join ORDHDR ON SYSDTL.ORDNUM = ORDHDR.ORDNUM
Inner Join CUSTMR ON ORDHDR.PLNNUM = CUSTMR.PLNNUM
WHERE
SYSTRN.TRNTYP = 'CASPIK'
Автор: mmi
Дата сообщения: 09.06.2010 20:16
Попробуйте так. Это для MS SQL-я. Для заказов с одной транзакцией, как и для заказов с несколькими, но с одинаковым временем разница в минутах будет нулевой.


Код:
SELECT
SYSDTL.SHIPID,
sum(SYSTRN.TRNQTY) as TRNQTY,
datediff(minute,min(SYSTRN.SYSDAT),max(SYSTRN.SYSDAT)),
CUSTMR.CSTNAM
FROM
SYSDTL
Inner Join SYSTRN ON SYSTRN.TRNSEQ = SYSDTL.TRNSEQ
Inner Join ORDHDR ON SYSDTL.ORDNUM = ORDHDR.ORDNUM
Inner Join CUSTMR ON ORDHDR.PLNNUM = CUSTMR.PLNNUM
WHERE
SYSTRN.TRNTYP = 'CASPIK'
GROUP BY
SYSDTL.SHIPID,
CUSTMR.CSTNAM
Автор: Man_Without_Face
Дата сообщения: 15.06.2010 11:08
Доброго времени суток. Есть такой вот запрос:
[more]
select c.contracts_number,
c.contracts_fullname,
c.contracts_unn,
c.contracts_account,

i.invoicecards_number,
i.invoicecards_datetime,
i.invoicecards_countcards,
i.invoicecards_countcards * i.invoicecards_pricecard as invoicecards_summ,

(if p.payments_summa = 0 then p.payments_forcardsumma else '' endif) as payments_forcardsumma,
abs(if p.payments_summa <> 0 then p.payments_summa else '' endif) as payments_summa,
p.payments_number,
p.payments_registerdate,

r.periodstatus_cardstartsumma,
r.periodstatus_period

from roman.contracts c left OUTER JOIN berlio.invoicecards i
on (c.contracts = i.invoicecards_contract and i.invoicecards_datetime >= '2010.03.01' and i.invoicecards_datetime < '2010.04.01')
left OUTER JOIN roman.payments p on ((p.payments_flags & 128) <> 0 and p.payments_registerdate >= '2010.03.01' and p.payments_registerdate < '2010.04.01' and c.contracts = p.payments_contract)
left OUTER JOIN roman.periodstatus r on r.periodstatus_contract = c.contracts, roman.periods n

where
c.contracts_type = 5

and n.periods = r.periodstatus_period
and n.periods_begindate = '2010.03.01'
and (if n.periods_enddate is null then today(*) else n.periods_enddate endif) = (if n.periods_enddate is null then '2010.04.01' -- -1
else '2010.04.01' endif)
and (coalesce(invoicecards_summ, p.payments_summa) is not null or r.periodstatus_cardstartsumma <>0)
order by c.contracts_number
[/more]

Допустим в таблице invoicecards три записи, в payments две. С помощью джоинов идет объединение, получается декартово произведение, т.е. получается шесть строк. Вопрос: можно ли как-нибудь изменить этот запрос, чтобы шли сначала три строки из invoicecards (поля соответствующие payments значение Null), а потом две строки из payments (поля соответствующие invoicecards значение Null)?
Автор: A_V
Дата сообщения: 15.06.2010 17:44
Man_Without_Face
особо не смотрел, но что-то не заметно у тебя в запросе условия связки этих таблиц. так что ты собственно и получаешь cross join, тогда как тебе нужен full
Автор: mmi
Дата сообщения: 15.06.2010 20:16
Man_Without_Face

Цитата:
Вопрос: можно ли как-нибудь изменить этот запрос, чтобы шли сначала три строки из invoicecards (поля соответствующие payments значение Null), а потом две строки из payments (поля соответствующие invoicecards значение Null)?


Про FULL JOIN уже Вам написали, того же можно добиться при помощи UNION-ов.
Порядок следования строк в результате определяется конструкцией ORDER BY.

invoicecards - это счета?
payments - это платежи?

Платежи и счета никак напрямую никак не связаны? Есть ли смысл их вообще вместе показывать?
Автор: megamozg13
Дата сообщения: 17.06.2010 11:32
Всем доброго времени суток.
Задачка запросом перекинуть значение поля из одной таблички в другую, таблицы в разных папках, фактически они одинаковые по данным и структуре.

"UPDATE 'C:\Base2\v_plat.db' SET v_plat.JOINHOZ=t_plat.JOINHOZ (SELECT JOINHOZ FROM 'C:\Base1\t_plat.db' WHERE (t_plat.indeks = v_plat.indeks))"

Borland BDE, таблички DB/paradox.

Гуру, в чем я не прав в запросе.
Автор: mmi
Дата сообщения: 17.06.2010 21:55
Попрбуйте так:


Код:
UPDATE 'C:\Base2\v_plat.db' a SET a.JOINHOZ=(SELECT JOINHOZ FROM 'C:\Base1\t_plat.db' b WHERE b.indeks = a.indeks)
Автор: megamozg13
Дата сообщения: 18.06.2010 09:00
mmi

Цитата:
Попрбуйте так: UPDATE 'C:\Base2\v_plat.db' a SET a.JOINHOZ=(SELECT JOINHOZ FROM 'C:\Base1\t_plat.db' b WHERE b.indeks = a.indeks)

Заработала!!! (с) Кот Матроскин
премного благодарен, тока записей много достаточно долго работает, буду дальше оптимизировать...




Добавлено:
Еще, вопрос, т.к. вся струкура полей в двух таблицах одинаковая можно ли каким хитрым способом сделать копирование данных из одной в другую "Insert ... Select..." без перебора всех полей?
Автор: SAURONoff
Дата сообщения: 18.06.2010 15:05
Здравствуйте! нужна помощь с запросом)

Имеется таблица. Два столбца. нужно сделать запрос, чтобы в результате был третий столбец с цифрой, зависящей от значений первых двух.
если точнее... первый столбец - класс номера, второй столбец - вид размещения. Вбиты числовые значения. Если в первом цифра 30, а во втором 1, то в третьем должна быть цифра 300. Вариантов значений не так много, так что указать их все в запросе не проблема. Проблема с видом запроса.
Я так понимаю, что там что-то вроде " SELECT Rocl, Razm, CASE Rocl WHEN 30 THEN '300' " должно быть, а как сделать по аналогии с двумя параметрами?

Страницы: 1234567891011121314

Предыдущая тема: Строковый параметр в REG_BINARY


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.