Имя: Пароль:
1C
1С v8
необычное объединение
0 Ненавижу 1С
 
гуру
13.09.12
12:54
Допустим есть 2 набора данных, первый:
ВАСЯ
ВАСЯ
ВАСЯ
ПЕТЯ
СЕНЯ

второй:
ВАСЯ
ВАСЯ
ПЕТЯ
ПЕТЯ
ДАША

требуется получить из них набор, в котором каждое значение встречается максимальное число раз из этих наборов, то есть в этом примере:

ВАСЯ
ВАСЯ
ВАСЯ
ПЕТЯ
ПЕТЯ
СЕНЯ
ДАША
1 Kashemir
 
13.09.12
12:57
А что нибудь уникальное у наборов есть ?
2 Ненавижу 1С
 
гуру
13.09.12
12:58
(1) интересует случай именно неуникальных данных
3 1C-band
 
13.09.12
12:59
ВЫБРАТЬ
   1 КАК Счетчик
^^^^^^^^^^ Это к основному запросу. Потом группируешь, суммируя эти единицы и сортируешь по убыванию. Эатем из этих запросов выбираешь первые 1.
4 mikecool
 
13.09.12
12:59
выбрать Результат
из
(
выбрать ЗначениеНабора1 Как Результат, 1 Как Счетчик1, 0 Как Счетчик2

объединить все

выбрать значениеНабора2, 0, 1 )
сгруппировать По Результат
имеющие Количество(Счетчик1) > Количество(Счетчик2)

+ наверное еще один набор с обратным условием
а может гоню )
5 МихаилМ
 
13.09.12
13:00
для каждого набора
проставить признак набора

объединить

свернуть посчитать колво
выбрать с  макс кол-вом

отобрать.
6 Kashemir
 
13.09.12
13:02
(5) А как ты развернуть по количеству собрался ?
7 Kashemir
 
13.09.12
13:03
(2) Тут без

ВЫБРАТЬ
   aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d КАК ЧислоИнтервала
ИЗ
   (ВЫБРАТЬ
       0 КАК a
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК aa,
   (ВЫБРАТЬ
       0 КАК b
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК bb,
   (ВЫБРАТЬ
       0 КАК c
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК cc,
   (ВЫБРАТЬ
       0 КАК d
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       1
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       2
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       3
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       4
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       5
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       6
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       7
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       8
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       9) КАК dd



не обойтись
8 МихаилМ
 
13.09.12
13:05
(7)
бред полный
9 Kashemir
 
13.09.12
13:05
(8) Давай талант, покажи пример запроса - посмеемся вместе
10 МихаилМ
 
13.09.12
13:06
(9)
не припомню чтобы мы с Вами на "ты" переходили
11 Ненавижу 1С
 
гуру
13.09.12
13:07
(7) если их будет больше данного интервала?
12 Ненавижу 1С
 
гуру
13.09.12
13:08
в общем требуется готовый ответ собственно, пальцем в носу ковыряться и я умею
13 Maxus43
 
13.09.12
13:08
14 GLazNik
 
13.09.12
13:09
Получаем две временных таблицы:
Вася 3
Петя 1
Сеня 1

Вася 2
Петя 2
Даша 1

Соединяем полным соединением по имени и получаем максимальный количество (МаксимальноеКоличество) и таблицу (Таблица) из которой это количество получилось

Соединяем последню таблицу с первоначальными таблицам примерно так:
ЛЕВОЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица1 ПО
Таб.Таблица = 1 И Таб.Имя = Таблица1.Имя
ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2 ПО
Таб.Таблица = 2 И Таб.Имя = Таблица2.Имя
15 Kashemir
 
13.09.12
13:10
Готовое решение. Ждем решения от многоуважаемого Михаила

ВЫБРАТЬ
   Набор1.Имя
ПОМЕСТИТЬ Набор1
ИЗ
   &Набор1 КАК Набор1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Набор2.Имя
ПОМЕСТИТЬ Набор2
ИЗ
   &Набор2 КАК Набор2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Имя КАК Имя
ИЗ
   (ВЫБРАТЬ
       ЕСТЬNULL(ВложенныйЗапрос.Имя, ВложенныйЗапрос1.Имя) КАК Имя,
       ВЫБОР
           КОГДА ЕСТЬNULL(ВложенныйЗапрос.КвоЗаписей1, 0) > ЕСТЬNULL(ВложенныйЗапрос1.КвоЗаписей2, 0)
               ТОГДА ЕСТЬNULL(ВложенныйЗапрос.КвоЗаписей1, 0)
           ИНАЧЕ ЕСТЬNULL(ВложенныйЗапрос1.КвоЗаписей2, 0)
       КОНЕЦ КАК МаксКоличество
   ИЗ
       (ВЫБРАТЬ
           Набор1.Имя КАК Имя,
           КОЛИЧЕСТВО(*) КАК КвоЗаписей1
       ИЗ
           Набор1 КАК Набор1
       
       СГРУППИРОВАТЬ ПО
           Набор1.Имя) КАК ВложенныйЗапрос
           ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               Набор2.Имя КАК Имя,
               КОЛИЧЕСТВО(*) КАК КвоЗаписей2
           ИЗ
               Набор2 КАК Набор2
           
           СГРУППИРОВАТЬ ПО
               Набор2.Имя) КАК ВложенныйЗапрос1
           ПО ВложенныйЗапрос.Имя = ВложенныйЗапрос1.Имя) КАК ВложенныйЗапрос
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d КАК ЧислоИнтервала
       ИЗ
           (ВЫБРАТЬ
               0 КАК a
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9) КАК aa,
           (ВЫБРАТЬ
               0 КАК b
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9) КАК bb,
           (ВЫБРАТЬ
               0 КАК c
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9) КАК cc,
           (ВЫБРАТЬ
               0 КАК d
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9) КАК dd) КАК ВложенныйЗапрос1
       ПО ВложенныйЗапрос.МаксКоличество > ВложенныйЗапрос1.ЧислоИнтервала

УПОРЯДОЧИТЬ ПО
   Имя
16 Ненавижу 1С
 
гуру
13.09.12
13:11
(14) вариант
17 Kashemir
 
13.09.12
13:11
(11) Требуется сразу определится сколько записей будет максимум - иначе не получится развернуть. Этот запрос 10000 записей тянет. Дальше надо добивать разряды
18 Ненавижу 1С
 
гуру
13.09.12
13:13
(17) тогда в топку
19 Kashemir
 
13.09.12
13:15
(18) Более универсального запроса все равно не получить.
20 Ненавижу 1С
 
гуру
13.09.12
13:17
(19) смотри (14)
21 Kashemir
 
13.09.12
13:19
(20) Не верю что взлетит. Есть готовый пример запроса ?
22 Classic
 
13.09.12
13:27
Кули тут делать. Нумеруем оба набора потом полныйджойн по значению и номеру
23 Kashemir
 
13.09.12
13:28
(21) Мда, был неправ - взлетит.
24 GLazNik
 
13.09.12
13:30
(21) Взлетит
Таблицы с подсчитанным количеством имен пусть будет Таб1 и Таб2, тогда Таб будет формироваться примерно так:
ВЫБРАТЬ
 ЕСТЬNULL(Таб1.Имя,Таб2.Имя) КАК Имя,
 ВЫБОР
   КОГДА ЕСТЬNULL(Таб1.Количество,0)>=ЕСТЬNULL(Таб2.Количество,0)
     Тогда 1
   ИНАЧЕ 2
 КОНЕЦ Таблица
ИЗ Таб1
ПОЛНОЕ СОЕДИНЕНИЕ Таб2 ПО Таб1.Имя = Таб2.Имя

Второй вариант:
ВЫБРАТЬ
 Имя,
 1 КАК Количество1
 0 КАК Количество2
ИЗ Таблица1

ОБЪЕДЕНИТЬ ВСЕ


ВЫБРАТЬ
 Имя,
 0,
 1
ИЗ Таблица2

группируем
и соединение меняем:
ЛЕВОЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица1 ПО
Таб.Количество1 >= Таб.Количество2 И Таб.Имя = Таблица1.Имя
ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2 ПО
Таб.Количество1 < Таб.Количество2 И Таб.Имя = Таблица2.Имя
25 Kashemir
 
13.09.12
13:32
(24) Да, я уже понял - согласен.


ВЫБРАТЬ
   Набор1.Имя
ПОМЕСТИТЬ Набор1
ИЗ
   &Набор1 КАК Набор1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Набор2.Имя
ПОМЕСТИТЬ Набор2
ИЗ
   &Набор2 КАК Набор2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Имя КАК Имя,
   ВложенныйЗапрос.НомерИсходной
ИЗ
   (ВЫБРАТЬ
       ЕСТЬNULL(ВложенныйЗапрос.Имя, ВложенныйЗапрос1.Имя) КАК Имя,
       ВЫБОР
           КОГДА ЕСТЬNULL(ВложенныйЗапрос.КвоЗаписей1, 0) > ЕСТЬNULL(ВложенныйЗапрос1.КвоЗаписей2, 0)
               ТОГДА 1
           ИНАЧЕ 2
       КОНЕЦ КАК НомерИсходной
   ИЗ
       (ВЫБРАТЬ
           Набор1.Имя КАК Имя,
           КОЛИЧЕСТВО(*) КАК КвоЗаписей1
       ИЗ
           Набор1 КАК Набор1
       
       СГРУППИРОВАТЬ ПО
           Набор1.Имя) КАК ВложенныйЗапрос
           ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               Набор2.Имя КАК Имя,
               КОЛИЧЕСТВО(*) КАК КвоЗаписей2
           ИЗ
               Набор2 КАК Набор2
           
           СГРУППИРОВАТЬ ПО
               Набор2.Имя) КАК ВложенныйЗапрос1
           ПО ВложенныйЗапрос.Имя = ВложенныйЗапрос1.Имя) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ Набор1 КАК Набор1
       ПО (ВложенныйЗапрос.НомерИсходной = 1
               И ВложенныйЗапрос.Имя = Набор1.Имя)
       ЛЕВОЕ СОЕДИНЕНИЕ Набор2 КАК Набор2
       ПО (ВложенныйЗапрос.НомерИсходной = 2
               И ВложенныйЗапрос.Имя = Набор2.Имя)

УПОРЯДОЧИТЬ ПО
   Имя
26 Ненавижу 1С
 
гуру
13.09.12
13:41
и даже без полного соединения

ВЫБРАТЬ
   Т1.Поле1,
   КОЛИЧЕСТВО(*) КАК КоличествоСтрок,
   1 КАК Флаг
ПОМЕСТИТЬ Временная
ИЗ
   Т1 КАК Т1

СГРУППИРОВАТЬ ПО
   Т1.Поле1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   Т2.Поле1,
   КОЛИЧЕСТВО(*),
   2
ИЗ
   Т2 КАК Т2

СГРУППИРОВАТЬ ПО
   Т2.Поле1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Временная.Поле1,
   МАКСИМУМ(Временная.КоличествоСтрок) КАК КоличествоСтрок
ПОМЕСТИТЬ Свернутая
ИЗ
   Временная КАК Временная

СГРУППИРОВАТЬ ПО
   Временная.Поле1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Временная.Поле1,
   МИНИМУМ(Временная.Флаг) КАК Флаг
ПОМЕСТИТЬ Результирующая
ИЗ
   Свернутая КАК Свернутая
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Временная КАК Временная
       ПО Свернутая.Поле1 = Временная.Поле1
           И Свернутая.КоличествоСтрок = Временная.КоличествоСтрок

СГРУППИРОВАТЬ ПО
   Временная.Поле1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ЕСТЬNULL(Т1.Поле1, Т2.Поле1) КАК Поле1
ИЗ
   Результирующая КАК Результирующая
       ЛЕВОЕ СОЕДИНЕНИЕ Т1 КАК Т1
       ПО Результирующая.Поле1 = Т1.Поле1
           И (Результирующая.Флаг = 1)
       ЛЕВОЕ СОЕДИНЕНИЕ Т2 КАК Т2
       ПО Результирующая.Поле1 = Т2.Поле1
           И (Результирующая.Флаг = 2)
27 Kashemir
 
13.09.12
13:43
(26) Да это понятно. Метод выбора таблицы с максимумом не вызывал затруднений.
28 vmv
 
13.09.12
13:51
ОБЪЕДИНИТЬ ВСЕ и расчить количество в результующей таблице(группирвками, итогами, агрегатами - в зависимости от степени любви к извращениям)

мдя, тупая тривиальная задача
29 МихаилМ
 
13.09.12
14:03
-- обединяем таблицы с простановкой признака nf,kbws
select nomTab,name
into  #allTAbs
from
(
select 1 as nomTab,name from Table_1
union all
select 2 as nomTab,name from Table_2
) as uny


-- подсчитываем количество совпадений
select nomTab,name,count(name) as countname
into #countsTabs
from #allTAbs
group by nomTab,name


-- ищем наибольшие количества

select  name,max (countname) maxCountName
into #MaxNomsCommon
from #countsTabs
group by name


--select * from #MaxNomsCommon

-- для случяя с совпадения количества
-- берем количество из таблицы с наибольшим номером

select  max(t1.nomTab) nomTab,t1.name,t1.countname
into #MaxNoms

from #countsTabs as t1
INNER JOIN #MaxNomsCommon t2
on (t1.name = t2.name)
 and
  (t1.countname = t2.maxCountName)
group by t1.name,t1.countname

-- окончательная выборка

select #allTAbs.name
from #allTAbs
inner join  #MaxNoms
on (#allTAbs.name = #MaxNoms.name)
 and
  (#allTAbs.nomTab = #MaxNoms.nomTab)


drop table #MaxNoms
drop table #MaxNomsCommon
drop table #countsTabs
drop table #allTAbs
30 Kashemir
 
13.09.12
14:57
(29) Молодец. Сразу видно - старая школа - накидать запрос за полчаса в блокноте вместо 5 минут в конструкторе.

ПыСы - а временные таблицы обязательно в конце чистить ?
31 Ненавижу 1С
 
гуру
13.09.12
15:13
(28) ун после готовых ответов вышли настоящие Д'Артаньяны
32 МихаилМ
 
13.09.12
15:19
(30)
для TSQL - желательно. и не чистить, а удалять.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой