Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как поэлегантней найти несовпадающие серии (число прочтений - 1899 )
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Как поэлегантней найти несовпадающие серии
11. Декабря 2007 :: 11:54
Печать  
Приведенный запрос показывает дубли Товар, АдресХранения, Серия
Но нужно выявить такие строки документа, где Товар и Адрес совпадают а серии разные

Товар 1, 01-01-01, 0123
Товар 1, 01-01-01, 0123
Это хорошо, должен быть пустой набор строк

Товар 1, 01-01-01, 0123
Товар 1, 01-01-01, 0153
Это плохо
 
Вот напал тупняг - как лучше?

Код
Выбрать все
	|SELECT $Строки.Товар				AS Товар
	|, $Строки." + НазваниеАдреса + "	AS АдресХранения
	|, $Ключи.Серия
	|FROM $ДокументСтроки." + ВидДок + " AS Строки With (NOLOCK)
	|LEFT JOIN $Справочник.Ключи AS Ключи With (NOLOCK) ON Ключи.ID = $Строки.Ключ
	|WHERE (Строки.IDDOC = :ВыбДок) AND ($Строки." + НазваниеАдреса + " <> $ПустойИД)
	|GROUP BY $Строки.Товар, $Строки." + НазваниеАдреса + ", $Ключи.Серия
	|HAVING COUNT(*) > 1

 

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как поэлегантней найти несовпадающие серии
Ответ #1 - 11. Декабря 2007 :: 12:19
Печать  
Код
Выбрать все
SELECT
    Данные.Товар,
    Данные.АдресХранения,
    $Ключи.Серия AS Серия
FROM (
    SELECT
	  $Строки.Товар AS Товар,
	  $Строки." + НазваниеАдреса + " AS АдресХранения
    FROM $ДокументСтроки." + ВидДок + " AS Строки With (NOLOCK)
    LEFT JOIN $Справочник.Ключи AS Ключи With (NOLOCK) ON Ключи.ID = $Строки.Ключ
    WHERE (Строки.IDDOC = :ВыбДок) AND ($Строки." + НазваниеАдреса + " <> $ПустойИД)
    GROUP BY $Строки.Товар, $Строки." + НазваниеАдреса + "
    HAVING COUNT(DISTINCT $Ключи.Серия) > 1
) AS Данные
LEFT JOIN $ДокументСтроки." + ВидДок + " AS Строки With (NOLOCK) ON Строки.IDDOC = :ВыбДок
    AND Данные.Товар = $Строки.Товар
    AND Данные.АдресХранения = $Строки." + НазваниеАдреса + "
LEFT JOIN $Справочник.Ключи AS Ключи With (NOLOCK) ON Ключи.ID = $Строки.Ключ
ORDER BY Строки.lineno_
 

  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как поэлегантней найти несовпадающие серии
Ответ #2 - 11. Декабря 2007 :: 12:19
Печать  
Вроде вот так получилось если вот это добавить:

Код
Выбрать все
	|LEFT JOIN $ДокументСтроки.ВнПеремещение AS Строки2 With (NOLOCK) ON $Строки.Товар = $Строки2.Товар AND $Строки.АдресХраненияПриемник = $Строки2.АдресХраненияПриемник
	|LEFT JOIN $Справочник.Ключи AS Ключи2 With (NOLOCK) ON Ключи2.ID = $Строки2.Ключ
	--... к условию
	|AND ($Ключи2.Серия <> $Ключи.Серия)
 

  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как поэлегантней найти несовпадающие серии
Ответ #3 - 11. Декабря 2007 :: 12:23
Печать  
Спасибки, Дмитро
В принципе даже и проще вышло (если не туплю):

Код
Выбрать все
	ТекстЗапроса = "
	|SELECT Строки2.LINENO_				НомерСтроки
	|, $Строки2.Товар					AS [Товар $Справочник.Номенклатура]
	|, $Строки2.АдресХраненияПриемник	AS [Адрес $Справочник.АдресаХранения]
	|, $Ключи2.Серия					AS Серия
	|FROM $ДокументСтроки.ВнПеремещение AS Строки With (NOLOCK)
	|LEFT JOIN $Справочник.Ключи AS Ключи With (NOLOCK) ON Ключи.ID = $Строки.Ключ
	|LEFT JOIN $ДокументСтроки.ВнПеремещение AS Строки2 With (NOLOCK) ON $Строки.Товар = $Строки2.Товар AND $Строки.АдресХраненияПриемник = $Строки2.АдресХраненияПриемник
	|LEFT JOIN $Справочник.Ключи AS Ключи2 With (NOLOCK) ON Ключи2.ID = $Строки2.Ключ
	|WHERE (Строки.IDDOC = :ВыбДок) AND (Строки2.IDDOC = :ВыбДок) AND ($Строки.АдресХраненияПриемник <> $ПустойИД)
	|AND ($Ключи2.Серия <> $Ключи.Серия)
    |";

 

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как поэлегантней найти несовпадающие серии
Ответ #4 - 11. Декабря 2007 :: 12:36
Печать  
Твой вариант показывает все комбинации различных серий (при определенном товаре и адресе), если различных серий всего две, то да, он покажет нужный результат, если их больше, он покажет все варианты их комбинаций - будут лишние записи в результате.
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как поэлегантней найти несовпадающие серии
Ответ #5 - 11. Декабря 2007 :: 12:40
Печать  
Согласен, на тестовом примере из трех строк
Товар 1, 01-01-01, 123
Товар 1, 01-01-01, 123
Товар 1, 01-01-01, 454
Выдало у меня четыре Улыбка
Буду твое юзать, сеньк
  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как поэлегантней найти несовпадающие серии
Ответ #6 - 11. Декабря 2007 :: 12:42
Печать  
Хотя если к моему добавить Distinct то вроде и ничего  Озадачен
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать