Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) DISTINCTROW или как полчить уникальные записи (число прочтений - 5140 )
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
DISTINCTROW или как полчить уникальные записи
28. Октября 2008 :: 13:00
Печать  
Есть запрос, родил долгими муками, Но он возвращает несколько записей. Подскажите как обрезать, что бы получить только по одной записи (Первой)  по одному полю...
Вот если бы работал DISTINCTROW..... Не хотит...  
Забыл указать dbf
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: DISTINCTROW или как полчить уникальные записи
Ответ #1 - 28. Октября 2008 :: 14:01
Печать  
Ты хоть запрос покажи
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: DISTINCTROW или как полчить уникальные записи
Ответ #2 - 28. Октября 2008 :: 19:10
Печать  
Вложенный запрос, соединение, ... что-то еще
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: DISTINCTROW или как полчить уникальные записи
Ответ #3 - 29. Октября 2008 :: 05:23
Печать  
     |SELECT   --  DISTINCTROW
     |т4.Сотрудник  as [Сотрудник $Справочник.Сотрудники]
     |,Привив.ID  AS [Прививка $Справочник.Прививки]
     |,ПрививкиДок.МаксДата
     |
     |FROM  $Справочник.Сотрудники as Сотруд,$Справочник.Прививки as Привив
     |,
     |
     | (SELECT COUNT(*) as cntl,  $ВводПрививокСтроки.Сотрудник as Сотрудник
     |      , $ВводПрививокСтроки.ПрививкаParentID as Родитель
     |FROM $ДокументСтроки.ВводПрививок AS ВводПрививокСтроки 
     |WHERE  $ВводПрививокСтроки.ПрививкаParentID  <> '"+Прочие+ "'
     |      GROUP  BY Сотрудник,Родитель
     |) as т4 
     |
     |--{ Получаем дату
     |inner JOIN
     |(
     |      SELECT MAX($Пр.ДатаПрививки) as МаксДата,$Пр.Сотрудник As Сотру,$Пр.ПрививкаParentID As Род
     |            FROM $ДокументСтроки.ВводПрививок as Пр
     |                  WHERE  $Пр.ПрививкаParentID<>'"+Прочие+ "'
     |            Group By $Пр.Сотрудник,$Пр.ПрививкаParentID
     |      )
     |      as ПрививкиДок  ON  ПрививкиДок.Сотру =Т4.Сотрудник
     | and  ПрививкиДок.Род =т4.Родитель
     |--}   
     |
     |WHERE  ( Сотруд.IsFolder = 2) and  (Привив.IsFolder=2)
     |and Сотруд.ID =т4.Сотрудник AND Привив.ParentId = т4.Родитель 
     |And  Привив.ParentId<> '"+Прочие+ "'
     |
     |and Привив.id not in
     |(
     |SELECT  $т6.Прививка FROM  $ДокументСтроки.ВводПрививок AS т6 
     |      WHERE  Привив.id =$т6.ПрививкаParentID
     |)
     |and Привив.id not in
     |(
     |SELECT  $т6.Прививка FROM  $ДокументСтроки.ВводПрививок AS т6 
     |      WHERE   Сотруд.id =$т6.Сотрудник
     |)   
     |
     |ORDER BY Сотрудник -- ,Привив.ID,ПрививкиДок.МаксДата

  
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: DISTINCTROW или как полчить уникальные записи
Ответ #4 - 29. Октября 2008 :: 14:52
Печать  
Это что ли? Улыбка

Select top 1
ID
,DESCR
,$Справочник.Контрагенты.ИНН
FROM
$Справочник.Контрагенты
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: DISTINCTROW или как полчить уникальные записи
Ответ #5 - 30. Октября 2008 :: 05:40
Печать  
К сожалению это возвращает одну запись, а мне нужно по одной каждого сотрудника. Запрос формирует  и возвращает несколько записей по каждому сотруднику.... может я что то перемудрил...
Суть в чем:
есть три таблицы. Нужно получить уникальные записи по каждому сотруднику(Таблица1), который есть в таблице 3 и из таблицы2, которые отсутствуют в таблице 3
т.е. результат должен  выглядеть так
одна запись по сотруднику+ поле из таблицы2
сотрудник есть в Таблице3, Поля из таблицы2 нет в таблице3
Таб1                Таб2                          Таб3
А                    АА                             A  AA                        
B                    AB                             A  AB
C                    AC                             A  AC
D                    BA                             B  AA  
E                    BB                              B AB
F                    GT                              C AA
                                                       C GT
                                                       E GT
Результат                Мой запрос
B        AC                 B       AC
C        AB                 C       AB  -- Нужная запись
                               C      AC  -- не нужна
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: DISTINCTROW или как полчить уникальные записи
Ответ #6 - 30. Октября 2008 :: 06:20
Печать  
nicolas писал(а) 30. Октября 2008 :: 05:40:
К сожалению это возвращает одну запись, а мне нужно по одной каждого сотрудника.

Сгруппировать по сотруднику?
  
Наверх
 
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: DISTINCTROW или как полчить уникальные записи
Ответ #7 - 30. Октября 2008 :: 07:19
Печать  
JohnyDeath писал(а) 30. Октября 2008 :: 06:20:
[Сгруппировать по сотруднику?

нет именно получить одну запись. Там сумм нет.
Мне возвращается много записей.....


  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: DISTINCTROW или как полчить уникальные записи
Ответ #8 - 30. Октября 2008 :: 07:22
Печать  
nicolas писал(а) 30. Октября 2008 :: 07:19:
JohnyDeath писал(а) 30. Октября 2008 :: 06:20:
[Сгруппировать по сотруднику?

нет именно получить одну запись. Там сумм нет.
Мне возвращается много записей.....

Тебе ж надо по одной записи по КАЖДОМУ сотруднику?
Ну так и сгруппируй по сотруднику, а в остальных полях поставь MAX или MIN
  
Наверх
 
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: DISTINCTROW или как полчить уникальные записи
Ответ #9 - 30. Октября 2008 :: 08:35
Печать  
Пожалуйста, пните в каком месте эти MAX и MIN Поставить....
Вроде уже все перепробывал...
Наверное придется в индексированную таблицу и там все ворочать....
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: DISTINCTROW или как полчить уникальные записи
Ответ #10 - 30. Октября 2008 :: 09:24
Печать  
Ну если ты говоришь, что у тебя запрос правильный и я тебя верно понял, то примерно так:
Код
Выбрать все
|SELECT   --  DISTINCTROW
	|т4.Сотрудник  as [Сотрудник $Справочник.Сотрудники]
	|,MAX(Привив.ID)  AS [Прививка $Справочник.Прививки]
	|,MAX(ПрививкиДок.МаксДата)
	|
	|FROM  $Справочник.Сотрудники as Сотруд,$Справочник.Прививки as Привив
	|,
	|
	| (SELECT COUNT(*) as cntl,  $ВводПрививокСтроки.Сотрудник as Сотрудник
	|	, $ВводПрививокСтроки.ПрививкаParentID as Родитель
	|FROM $ДокументСтроки.ВводПрививок AS ВводПрививокСтроки  
	|WHERE  $ВводПрививокСтроки.ПрививкаParentID  <> '"+Прочие+ "'
	|	GROUP  BY Сотрудник,Родитель
	|) as т4  
	|
	|--{ Получаем дату
	|inner JOIN
	|(
	|	SELECT MAX($Пр.ДатаПрививки) as МаксДата,$Пр.Сотрудник As Сотру,$Пр.ПрививкаParentID As Род
	|		FROM $ДокументСтроки.ВводПрививок as Пр
	|			WHERE  $Пр.ПрививкаParentID<>'"+Прочие+ "'
	|		Group By $Пр.Сотрудник,$Пр.ПрививкаParentID
	|	)
	|	as ПрививкиДок  ON  ПрививкиДок.Сотру =Т4.Сотрудник
	| and  ПрививкиДок.Род =т4.Родитель
	|--}    
	|
	|WHERE  ( Сотруд.IsFolder = 2) and  (Привив.IsFolder=2)
	|and Сотруд.ID =т4.Сотрудник AND Привив.ParentId = т4.Родитель  
	|And  Привив.ParentId<> '"+Прочие+ "'
	|
	|and Привив.id not in
	|(
	|SELECT  $т6.Прививка FROM  $ДокументСтроки.ВводПрививок AS т6  
	|	WHERE  Привив.id =$т6.ПрививкаParentID
	|)
	|and Привив.id not in
	|(
	|SELECT  $т6.Прививка FROM  $ДокументСтроки.ВводПрививок AS т6  
	|	WHERE   Сотруд.id =$т6.Сотрудник
	|)  
	|
	|ORDER BY Сотрудник -- ,Привив.ID,ПрививкиДок.МаксДата
	|GROUP BY т4.Сотрудник 


  
Наверх
 
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: DISTINCTROW или как полчить уникальные записи
Ответ #11 - 30. Октября 2008 :: 10:13
Печать  
БОЛЬШОЕ СПАСИБО!!!!!
В моем случае надо MIN()
Все получилось.....
Тема закрыта
  
Наверх
 
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: DISTINCTROW или как полчить уникальные записи
Ответ #12 - 30. Октября 2008 :: 13:39
Печать  
Вобщем может гуру и знают но вот сам столкнулся и может кому жизнь облегчит.
Если в запросе секции From перенести
Подзапрос выше то выдает ошибку
     |FROM  $Справочник.Сотрудники as Сотруд
     |,
     |
     | (SELECT COUNT(*) as cntl,  $ВводПрививокСтроки.Сотрудник as Сотрудник
     |      , $ВводПрививокСтроки.ПрививкаParentID as Родитель
     |FROM $ДокументСтроки.ВводПрививок AS ВводПрививокСтроки  
     |WHERE  $ВводПрививокСтроки.ПрививкаParentID  <> '"+Прочие+ "'
     |      GROUP  BY Сотрудник,Родитель
     |) as т4
     |,$Справочник.Прививки as Привив


Column '     ' is not found.

     |FROM  $Справочник.Сотрудники as Сотруд,$Справочник.Прививки as Привив
     |,
     |
     | (SELECT COUNT(*) as cntl,  $ВводПрививокСтроки.Сотрудник as Сотрудник
     |      , $ВводПрививокСтроки.ПрививкаParentID as Родитель
     |FROM $ДокументСтроки.ВводПрививок AS ВводПрививокСтроки  
     |WHERE  $ВводПрививокСтроки.ПрививкаParentID  <> '"+Прочие+ "'
     |      GROUP  BY Сотрудник,Родитель
     |) as т4
А так без ошибок, но
нет возможности обратится к таблице $Справочник.Прививки as Привив
выдаст ошибку  Column '     ' is not found
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: DISTINCTROW или как полчить уникальные записи
Ответ #13 - 30. Октября 2008 :: 14:23
Печать  
А если вместо запятой написать cross join?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: DISTINCTROW или как полчить уникальные записи
Ответ #14 - 31. Октября 2008 :: 07:35
Печать  
Вобщем не знаю где больше копать, но результата не получил при применении Cross JOIN
ошибка одна и та же
CommandText::Execute(): Command contains unrecognized phrase/keyword.
Пробывал все варианты,
пните если, что то делаю не так.
     |SELECT
     |т4.Сотрудник  as [Сотрудник $Справочник.Сотрудники]
     |,Привив.ID  AS [Прививка $Справочник.Прививки]
     |
     |FROM  
     |(SELECT COUNT(*) as cntl,  $ВводПрививокСтроки.Сотрудник as Сотрудник
     |      , $ВводПрививокСтроки.ПрививкаParentID as Родитель
     |FROM $ДокументСтроки.ВводПрививок AS ВводПрививокСтроки  
     |WHERE  $ВводПрививокСтроки.ПрививкаParentID  <> '"+Прочие+ "'
     |      GROUP  BY Сотрудник,Родитель
     |) as т4
     |Cross JOIN  $Справочник.Прививки as Привив
     |Cross JOIN  $Справочник.Сотрудники as Сотруд

Дает ошибку
так то же
     |SELECT
     |т4.Сотрудник  as [Сотрудник $Справочник.Сотрудники]
     |,Привив.ID  AS [Прививка $Справочник.Прививки]
     |
     |FROM $Справочник.Сотрудники as Сотруд,
     |(SELECT COUNT(*) as cntl,  $ВводПрививокСтроки.Сотрудник as Сотрудник
     |      , $ВводПрививокСтроки.ПрививкаParentID as Родитель
     |FROM $ДокументСтроки.ВводПрививок AS ВводПрививокСтроки  
     |WHERE  $ВводПрививокСтроки.ПрививкаParentID  <> '"+Прочие+ "'
     |      GROUP  BY Сотрудник,Родитель
     |) as т4
     |Cross JOIN  $Справочник.Прививки as Привив
Ну и еще комбинации все дают ошибку, кроме если в секции From Использовать запятую.......
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать