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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2012, 10:57   #1
SovereignSun
Форумчанин
 
Регистрация: 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 Счета.Договор=Договора.Договор

Пожалуйста помогите.
SovereignSun вне форума Ответить с цитированием
Старый 13.01.2012, 11:59   #2
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 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.
rdama вне форума Ответить с цитированием
Старый 13.01.2012, 12:09   #3
lyb4eg
Пользователь
 
Регистрация: 06.08.2011
Сообщений: 76
По умолчанию

http://programmersforum.ru/showthread.php?t=183491 - посмотрите мою тему, предполагаю, можно разбить столбец, а потом или через группирование или ещё как-то, далее думаю не проблема ... Если будет время, постараюсь воспроизвести запрос.
lyb4eg вне форума Ответить с цитированием
Старый 13.01.2012, 12:19   #4
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Кстати я попробовал через distinct отобрать Договор, но он пишет что-то связанное с неоднозначным полем, это что? Просто я могу отобрать например по полю Организация, но надо именно по полю договор, суть в том, что при нажатии в DBGRID на строку, в следующем DBGRID уже по запросу отображаються все записи этого Договора методом:
qry2.SQL.Text:='Select * From Договора Left join Счета ON Договора.Договор=Счета.Договор where Счета.Договор like '+chr(39)+'%'+String1+chr(39);

У меня вопрос есть вариант сделать поле Договор distinct'образныем? Разделив его на две части (до и после тире)?
SovereignSun вне форума Ответить с цитированием
Старый 13.01.2012, 12:55   #5
lyb4eg
Пользователь
 
Регистрация: 06.08.2011
Сообщений: 76
По умолчанию

Извините, в MS не силен(, могу только предложить алгоритм по которому решал бы в PLSQL.
в подзапросе разделить столбец (задать новые названия столбцов и таблицы, таким образом мы получим новую таблицу), которую уже в запросе используя group by номер договора.
distinct здесь не подойдет. Кажется так, если правильно понял условие...
lyb4eg вне форума Ответить с цитированием
Старый 13.01.2012, 13:12   #6
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Цитата:
Сообщение от rdama Посмотреть сообщение
SELECT top 1 with [fields] from [table]
ORDER BY ну думаю id у вас есть OVER (PARTITION BY поле по которому создаются окна ORDER BY ну тут по чем сортировка в окне(т.е. первую запись относительно чего))

Смысл такой. Ваша таблица разбивается на окна по указанному полю(PARTITION BY), которые отсортированы как вы укажите(ORDER BY).
И из этих окон отбирается первая запись top 1 with
Как правильно Partition by использовать, я синтаксис посмотрел, но все равно не хочет:
SELECT top 1 with * from Счета ORDER BY Идентификатор OVER (PARTITION BY Идентификатор ORDER BY Договора.Организация)
Left join Договора
ON Счета.Договор=Договора.Договор
SovereignSun вне форума Ответить с цитированием
Старый 13.01.2012, 13:29   #7
SovereignSun
Форумчанин
 
Регистрация: 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 ООО "Рудник"
SovereignSun вне форума Ответить с цитированием
Старый 13.01.2012, 13:37   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В предположении, что структура номера договора везде имеет указанный вами формат создадим для удобства временную таблицу #TempDog
Код:
SELECT LEFT(Договор,7) AS LDog,RIGHT(Договор,5) AS RDog
  INTO #TempDog
  FROM Договор
Следующий запрос вернет таблицу с левой и правой частью номера ноговора с уникальными значениями в обеих колонках, причем часть договоров может не попасть (добавить в ваш пример договор ОРФ1045-14874 - по вашему условию он не попадет). Не нравится временная таблица, замените в запросе #TempDog на подзапрос приведенный выше, выбросив из него INTO
Код:
SELECT U.*
  FROM (
    SELECT T1.LDog,
        (SELECT TOP 1 T2.RDog
           FROM #TempDog T2
           WHERE T2.LDog=T1.LDog AND
                 NOT EXISTS (
                   SELECT *
                     FROM #TempDog T3
                     WHERE T3.LDog<T2.LDog AND T3.RDog=T2.RDog)
           ORDER BY T2.RDog) AS RDog
      FROM #TempDog T1) U
  WHERE U.RDog IS NOT NULL
  GROUP BY U.LDog,U.RDog
Дальше к результату прицепите данные одного счета. Кстати тоже не тривиально
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.01.2012, 13:49   #9
lyb4eg
Пользователь
 
Регистрация: 06.08.2011
Сообщений: 76
По умолчанию

Цитата:
Сообщение от SovereignSun Посмотреть сообщение
Разделил столбец Договор, спасибо 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 ООО "Рудник"


select *
from <подзапрос>
where <условие>
group by идентификатор, номер, договор, услуга, счет, организация;
lyb4eg вне форума Ответить с цитированием
Старый 13.01.2012, 13:50   #10
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Почему ОРФ1045-14874 не попадет? То же количество симолов.. но в любом случае у меня разделителем являеться знак "Тире", разделить столбцы получилось, теперь бы сделать так чтобы в графе Идентификатор Значения не повторялись. А Идентификатор это ведь не поле Таблицы получается.
SovereignSun вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как составить запрос по нескольким полям 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