![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 22.11.2011
Сообщений: 127
|
![]()
Пытаюсь составить запрос в голову не лезет ка кэто сделать.
Есть таблица где Поля Договор, Услуга, Счет и Организация: | Договор | Услуга | Счет | Организация ОРФ1020-14465 Крипто-Про 1 ООО "Юг-Сатурн" ОРФ1030-14465 ЭЦП 2 ООО "Юг-Сатурн" ОРФ1040-14465 Сертификат 3 ООО "Юг-Сатурн" ОРФ1030-14673 ЭЦП 4 ООО "Гранд" ОРФ1040-14673 Сертификат 5 ООО "Гранд" ОРФ1040-14874 Сертификат 6 ООО "Рудник" Как из такой таблицы получить такое: | Договор | Услуга | Счет | Организация ОРФ1020-14465 Крипто-Про 1 ООО "Юг-Сатурн" ОРФ1030-14673 ЭЦП 4 ООО "Гранд" ОРФ1040-14874 Сертификат 6 ООО "Рудник" Просто нужно чтобы отрезались все повторяющиеся записи, только первая найденая для каждого нового номер Договора, первые знаки до тире всегда совпадают, организации могут повторяться. Как это в SQL можно осуществит, если учесть что я работаю с базой через ADO MS SQL, оригинальный запрос который сейчас используется в базе: select * from Счета Left join Договора ON Счета.Договор=Договора.Договор Пожалуйста помогите. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 25.07.2009
Сообщений: 533
|
![]()
SELECT top 1 with [fields] from [table]
ORDER BY ну думаю id у вас есть OVER (PARTITION BY поле по которому создаются окна ORDER BY ну тут по чем сортировка в окне(т.е. первую запись относительно чего)) Смысл такой. Ваша таблица разбивается на окна по указанному полю(PARTITION BY), которые отсортированы как вы укажите(ORDER BY). И из этих окон отбирается первая запись top 1 with
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA) Последний раз редактировалось rdama; 13.01.2012 в 12:08. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 06.08.2011
Сообщений: 76
|
![]()
http://programmersforum.ru/showthread.php?t=183491 - посмотрите мою тему, предполагаю, можно разбить столбец, а потом или через группирование или ещё как-то, далее думаю не проблема ... Если будет время, постараюсь воспроизвести запрос.
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 22.11.2011
Сообщений: 127
|
![]()
Кстати я попробовал через distinct отобрать Договор, но он пишет что-то связанное с неоднозначным полем, это что? Просто я могу отобрать например по полю Организация, но надо именно по полю договор, суть в том, что при нажатии в DBGRID на строку, в следующем DBGRID уже по запросу отображаються все записи этого Договора методом:
qry2.SQL.Text:='Select * From Договора Left join Счета ON Договора.Договор=Счета.Договор where Счета.Договор like '+chr(39)+'%'+String1+chr(39); У меня вопрос есть вариант сделать поле Договор distinct'образныем? Разделив его на две части (до и после тире)? |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 06.08.2011
Сообщений: 76
|
![]()
Извините, в MS не силен(, могу только предложить алгоритм по которому решал бы в PLSQL.
в подзапросе разделить столбец (задать новые названия столбцов и таблицы, таким образом мы получим новую таблицу), которую уже в запросе используя group by номер договора. distinct здесь не подойдет. Кажется так, если правильно понял условие... |
![]() |
![]() |
![]() |
#6 | |
Форумчанин
Регистрация: 22.11.2011
Сообщений: 127
|
![]() Цитата:
SELECT top 1 with * from Счета ORDER BY Идентификатор OVER (PARTITION BY Идентификатор ORDER BY Договора.Организация) Left join Договора ON Счета.Договор=Договора.Договор |
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 22.11.2011
Сообщений: 127
|
![]()
Разделил столбец Договор, спасибо lyb4eg )).. Теперь как поле Идентификатор сделать distinct?
у меня так получилось: | Идентификатор | Номер | Договор | Услуга | Счет | Организация 14465 ОРФ1020 ОРФ1020-14465 Крипто-Про 1 ООО "Юг-Сатурн" 14465 ОРФ1030 ОРФ1030-14465 ЭЦП 2 ООО "Юг-Сатурн" 14465 ОРФ1040 ОРФ1040-14465 Сертификат 3 ООО "Юг-Сатурн" 14673 ОРФ1030 ОРФ1030-14673 ЭЦП 4 ООО "Гранд" 14673 ОРФ1040 ОРФ1040-14673 Сертификат 5 ООО "Гранд" 14874 ОРФ1040 ОРФ1040-14874 Сертификат 6 ООО "Рудник" как теперь сделать? | Идентификатор | Номер | Договор | Услуга | Счет | Организация 14465 ОРФ1020 ОРФ1020-14465 Крипто-Про 1 ООО "Юг-Сатурн" 14673 ОРФ1030 ОРФ1030-14673 ЭЦП 4 ООО "Гранд" 14874 ОРФ1040 ОРФ1040-14874 Сертификат 6 ООО "Рудник" |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
В предположении, что структура номера договора везде имеет указанный вами формат создадим для удобства временную таблицу #TempDog
Код:
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#9 | |
Пользователь
Регистрация: 06.08.2011
Сообщений: 76
|
![]() Цитата:
select * from <подзапрос> where <условие> group by идентификатор, номер, договор, услуга, счет, организация; |
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 22.11.2011
Сообщений: 127
|
![]()
Почему ОРФ1045-14874 не попадет? То же количество симолов.. но в любом случае у меня разделителем являеться знак "Тире", разделить столбцы получилось, теперь бы сделать так чтобы в графе Идентификатор Значения не повторялись. А Идентификатор это ведь не поле Таблицы получается.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как составить запрос по нескольким полям | lysyuk1 | БД в Delphi | 3 | 17.11.2011 10:13 |
Составной запрос, как правильно составить? | Bendebej | SQL, базы данных | 10 | 26.02.2010 20:01 |
Как составить запрос? | jeka5555 | SQL, базы данных | 3 | 09.09.2009 10:12 |
Как составить запрос из каталога? | wegeras | PHP | 1 | 28.10.2008 13:36 |
Как правельно составить запрос!! | Areostar | SQL, базы данных | 3 | 16.02.2008 19:49 |