Запрос (не простой)

1. user-z99999 67 10.10.23 09:44 Сейчас в теме
Есть исходная таблица, из неё нужно получить таблицу как ниже.
Нужно всё сделать в запросе.

Я делаю первую [1] временную таблиц по типу А.
Делаю вторую [2] временную таблицу по типу Б.
Делаю временную таблицу [3] , получаю уникальные [точки-1-5]

И когда к последней таблице цепляю первую [1] и вторую [2], у меня задваивается Б и 10 (два раза), а нужно один раз.


Исходные данные:
ВЫБРАТЬ
	"точка-1" КАК КП,
	"А" КАК Тип,
	20 КАК Количество

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

ВЫБРАТЬ
	"точка-1",
	"А",
	40

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

ВЫБРАТЬ
	"точка-1",
	"Б",
	10

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

ВЫБРАТЬ
	"точка-2",
	"А",
	2

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

ВЫБРАТЬ
	"точка-2",
	"Б",
	3

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

ВЫБРАТЬ
	"точка-3",
	"Б",
	5

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

ВЫБРАТЬ
	"точка-4",
	"А",
	1

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

ВЫБРАТЬ
	"точка-4",
	"Б",
	2

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

ВЫБРАТЬ
	"точка-5",
	"А",
	55
Показать
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
23. user-z99999 67 10.10.23 11:42 Сейчас в теме
Решение получилось такое:
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.КП КАК КП,
	ВТ.Тип КАК Тип,
	ВТ.Количество КАК Количество
ПОМЕСТИТЬ ВТ1
ИЗ
	ВТ КАК ВТ
ГДЕ
	ВТ.Тип = "А"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.КП КАК КП,
	ВТ.Тип КАК Тип,
	ВТ.Количество КАК Количество
ПОМЕСТИТЬ ВТ2
ИЗ
	ВТ КАК ВТ
ГДЕ
	ВТ.Тип = "Б"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ1.КП КАК КП,
	ВТ1.Тип КАК Тип,
	ВТ1.Количество КАК Количество,
	АВТОНОМЕРЗАПИСИ() КАК ИД
ПОМЕСТИТЬ ВТ_3
ИЗ
	ВТ1 КАК ВТ1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ2.КП КАК КП,
	ВТ2.Тип КАК Тип,
	ВТ2.Количество КАК Количество,
	АВТОНОМЕРЗАПИСИ() КАК ИД
ПОМЕСТИТЬ ВТ_4
ИЗ
	ВТ2 КАК ВТ2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	А1.КП КАК КП,
	А1.Тип КАК Тип,
	А1.Количество КАК Количество,
	КОЛИЧЕСТВО(А1.ИД) КАК НПП
ПОМЕСТИТЬ ВТ_А
ИЗ
	ВТ_3 КАК А1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_3 КАК А2
		ПО А1.КП = А2.КП
			И А1.ИД >= А2.ИД

СГРУППИРОВАТЬ ПО
	А1.КП,
	А1.Тип,
	А1.Количество
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	А1.КП КАК КП,
	А1.Тип КАК Тип,
	А1.Количество КАК Количество,
	КОЛИЧЕСТВО(А1.ИД) КАК НПП
ПОМЕСТИТЬ ВТ_Б
ИЗ
	ВТ_4 КАК А1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_4 КАК А2
		ПО А1.КП = А2.КП
			И А1.ИД >= А2.ИД

СГРУППИРОВАТЬ ПО
	А1.КП,
	А1.Тип,
	А1.Количество
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА ВТ_А.КП ЕСТЬ NULL
			ТОГДА ВТ_Б.КП
		ИНАЧЕ ВТ_А.КП
	КОНЕЦ КАК КП,
	ВТ_А.Тип КАК Тип,
	ВТ_А.Количество КАК Количество,
	ВТ_Б.Тип КАК Тип1,
	ВТ_Б.Количество КАК Количество1
ИЗ
	ВТ_А КАК ВТ_А
		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Б КАК ВТ_Б
		ПО ВТ_А.КП = ВТ_Б.КП
			И ВТ_А.НПП = ВТ_Б.НПП
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. nomad_irk 76 10.10.23 10:39 Сейчас в теме
(1)Как вариант:
ВЫБРАТЬ 
	КП,
	Тип КАК ТипА,
	Количество КАК КоличествоА,
	"Б" КАК ТипБ,
	0 КАК КоличествоБ
ПОМЕСТИТЬ ВТОбщая
ИЗ
	ВТДанные
ГДЕ
	Тип = "А"
	
ОБЪЕДИНИТЬ 	

ВЫБРАТЬ 
	КП,
	"А", 
	0,
	Тип,
	Количество
ИЗ
	ВТДанные
ГДЕ
	Тип = "Б"
;
ВЫБРАТЬ
	КП,
	ТипА,
	СУММА(КоличествоА) КАК КОличествоА,
	ТипБ,
	СУмма(КоличествоБ) КАК КоличествоБ
ИЗ
	ВТОбщая
СГРУППИРОВАТЬ ПО
	КП,
	ТипА,
	ТипБ
Показать
5. user-z99999 67 10.10.23 10:44 Сейчас в теме
(4)
точка-1 у меня должна быть написана два раза. (а вы сложили её)
Посмотрите как должно получиться (картинка).
7. nomad_irk 76 10.10.23 10:47 Сейчас в теме
(5) тогда еще проще

ВЫБРАТЬ 
	КП,
	Тип КАК ТипА,
	Количество КАК КоличествоА,
	"" КАК ТипБ,
	0 КАК КоличествоБ
ПОМЕСТИТЬ ВТОбщая
ИЗ
	ВТДанные
ГДЕ
	Тип = "А"
	
ОБЪЕДИНИТЬ 	

ВЫБРАТЬ 
	КП,
	"", 
	0,
	Тип,
	Количество
ИЗ
	ВТДанные
ГДЕ
	Тип = "Б"
Показать
10. user-z99999 67 10.10.23 11:03 Сейчас в теме
(7)
Строка, где точка-1 должна быть два раза, у вас три раза.
Прикрепил, как у вас сейчас получилось.
Прикрепленные файлы:
20. nomad_irk 76 10.10.23 11:36 Сейчас в теме
(10)
Выбрать
	Т1.КП,
	Т1.Тип,
	Т1.Количество,
	СУММА(1) КАК НомерСтроки
ПОМЕСТИТЬ ВТДанные_
ИЗ
	ВТДанные КАК Т1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТДанные КАК Т2
		ПО Т1.КП = Т2.КП
			И Т1.Тип = Т2.Тип
			И Т1.Количество >= Т2.Количество
СГРУППИРОВАТЬ ПО
	Т1.КП,
	Т1.Тип,
	Т1.Количество
;
ВЫБРАТЬ 
	КП,
	Тип КАК ТипА, 
	Количество КАК КоличествоА,
	"Б" КАК ТипБ,
	0 КАК КоличествоБ,
	НомерСтроки
ПОМЕСТИТЬ ВТОбщая
ИЗ
	ВТДанные_
ГДЕ
	Тип = "А"
	
ОБЪЕДИНИТЬ 	

ВЫБРАТЬ 
	КП,
	"А", 
	0,
	Тип,
	Количество,
	НомерСтроки
ИЗ
	ВТДанные_
ГДЕ
	Тип = "Б"
;
ВЫБРАТЬ
	КП,
	ТипА,
	СУММА(КоличествоА) КАК КОличествоА,
	ТипБ,
	СУмма(КоличествоБ) КАК КоличествоБ
ИЗ
	ВТОбщая
СГРУППИРОВАТЬ ПО
	КП,
	ТипА,
	ТипБ,
	НомерСтроки
Показать
6. newlogin1 10.10.23 10:47 Сейчас в теме
(1)Последовательность строгая в итоговой таблице?
Т.е.
Точка 1 А 20 Б 10
Точка 1 А 40
Во всех случаях или не важно?
8. user-z99999 67 10.10.23 11:00 Сейчас в теме
(6)
Не важно, главное, чтобы Б 10 не повторялось два раза (когда стыкуем таблицы).
14. Sashares 34 10.10.23 11:08 Сейчас в теме
(1) Например, вот
ВЫБРАТЬ
 "точка-1" КАК КП,
 "А" КАК Тип,
 20 КАК Количество
ПОМЕСТИТЬ Таб1

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

ВЫБРАТЬ
 "точка-1",
 "А",
 40

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

ВЫБРАТЬ
 "точка-1",
 "Б",
 10

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

ВЫБРАТЬ
 "точка-2",
 "А",
 2

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

ВЫБРАТЬ
 "точка-2",
 "Б",
 3

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

ВЫБРАТЬ
 "точка-3",
 "Б",
 5

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

ВЫБРАТЬ
 "точка-4",
 "А",
 1

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

ВЫБРАТЬ
 "точка-4",
 "Б",
 2

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

ВЫБРАТЬ
 "точка-5",
 "А",
 55
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
 Таб1.КП КАК КП
ПОМЕСТИТЬ Типы
ИЗ
 Таб1 КАК Таб1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 Типы.КП КАК КП,
 А.Тип КАК ТипА,
 А.Количество КАК КоличествоА
ПОМЕСТИТЬ ТА
ИЗ
 Типы КАК Типы
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб1 КАК А
  ПО Типы.КП = А.КП
   И (А.Тип = "А")
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 Типы.КП КАК КП,
 Б.Тип КАК ТипБ,
 Б.Количество КАК КоличествоБ
ПОМЕСТИТЬ ТБ
ИЗ
 Типы КАК Типы
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб1 КАК Б
  ПО Типы.КП = Б.КП
   И (Б.Тип = "Б")
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 Типы.КП КАК КП,
 ТА.ТипА КАК ТипА,
 МИНИМУМ(ТА.КоличествоА) КАК КоличествоА,
 ТБ.ТипБ КАК ТипБ,
 МИНИМУМ(ТБ.КоличествоБ) КАК КоличествоБ
ПОМЕСТИТЬ ОбщаяТ
ИЗ
 Типы КАК Типы
  ЛЕВОЕ СОЕДИНЕНИЕ ТА КАК ТА
  ПО (Типы.КП = ТА.КП)
  ЛЕВОЕ СОЕДИНЕНИЕ ТБ КАК ТБ
  ПО (Типы.КП = ТБ.КП)

СГРУППИРОВАТЬ ПО
 Типы.КП,
 ТА.ТипА,
 ТБ.ТипБ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
 ОбщаяТ.КП КАК КП,
 ОбщаяТ.ТипА КАК ТипА,
 ОбщаяТ.КоличествоА КАК КоличествоА,
 ОбщаяТ.ТипБ КАК ТипБ,
 ОбщаяТ.КоличествоБ КАК КоличествоБ
ИЗ
 ОбщаяТ КАК ОбщаяТ

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

ВЫБРАТЬ
 ТА.КП,
 ТА.ТипА,
 ТА.КоличествоА,
 NULL,
 NULL
ИЗ
 ТА КАК ТА
  ЛЕВОЕ СОЕДИНЕНИЕ ОбщаяТ КАК ОбщаяТ
  ПО ОбщаяТ.КП = ТА.КП
  И ТА.ТипА = ОбщаяТ.ТипА
  И ТА.КоличествоА = ОбщаяТ.КоличествоА
ГДЕ 
 ОбщаяТ.ТипА Есть Null

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

ВЫБРАТЬ
 ТБ.КП,
 NULL,
 NULL,
 ТБ.ТипБ,
 ТБ.КоличествоБ
ИЗ
 ТБ КАК ТБ
  ЛЕВОЕ СОЕДИНЕНИЕ ОбщаяТ КАК ОбщаяТ
    ПО ОбщаяТ.КП = ТБ.КП
  И ТБ.ТипБ = ОбщаяТ.ТипБ
  И ТБ.КоличествоБ = ОбщаяТ.КоличествоБ
ГДЕ 
 ОбщаяТ.ТипБ Есть Null
Показать
Прикрепленные файлы:
2. PowerBoy 3370 10.10.23 10:22 Сейчас в теме
запрос показан не полностью.
3. user-z99999 67 10.10.23 10:29 Сейчас в теме
(2)
Запрос - это исходная таблица. Отображение таблички сверху.
Нужно сделать таблицу ниже.
9. ado163 15 10.10.23 11:01 Сейчас в теме
А смысл соединения какой? В чем связь между строками?
12. user-z99999 67 10.10.23 11:04 Сейчас в теме
(9)
Так заказчик хочет видеть исходные данные.
11. PowerBoy 3370 10.10.23 11:04 Сейчас в теме
(3)
ВЫБРАТЬ 
	Максимум(ВЫБОР
		КОГДА Тип="А"
			ТОГДА "А"
	КОНЕЦ), 
	
	Сумма(ВЫБОР КОГДА Тип="А"
			ТОГДА Количество
	КОНЕЦ),
	Максимум(ВЫБОР
		КОГДА Тип="Б"
			ТОГДА "Б"
	КОНЕЦ), 
	
	Сумма(ВЫБОР КОГДА Тип="Б"
			ТОГДА Количество
	КОНЕЦ)  
	ИЗ ВременнаяТаблица	как вт
	СГРУППИРОВАТЬ по вт.кп 
Показать
13. user-z99999 67 10.10.23 11:07 Сейчас в теме
(11)
точка-1 А 20 Б 10
точка-1 А 40

ваш запрос так не показывает. Нет столбца точка-1, а 20 и 40 суммируется.
Нужно как на картинке.
16. Said-We 10.10.23 11:17 Сейчас в теме
(13)
Нужно как на картинке.
Как на картинке с вашими исходными данными не получится.
ВЫБРАТЬ
    "точка-4",
    "Б",
    2
На картинке значение 1 :-) А у "А" соответственно значение 2.
15. Said-We 10.10.23 11:12 Сейчас в теме
(1) В чем сложность?
Прикрепленные файлы:
17. user-z99999 67 10.10.23 11:20 Сейчас в теме
(15)
Нужно сделать на языке запросов 1с, а у вас оконные функции sql, которых нет в 1с.
Попробуйте написать в синтаксисе запроса языка 1с.
22. Sashares 34 10.10.23 11:41 Сейчас в теме
(17)В 14 вариант чем не устраивает?
18. Said-We 10.10.23 11:21 Сейчас в теме
(17) Тоже самое. В 1С есть нумерация.
19. Sashares 34 10.10.23 11:35 Сейчас в теме
(18)И без нумерации работает
21. Said-We 10.10.23 11:38 Сейчас в теме
(19) Да, пронумеровать можно и без нумерации :-)
Всё что пишется оконными функциями, можно и без них написать. Только это будет более длинный текст запроса с кучей группировок. Который выполняется в общем случае дольше.
23. user-z99999 67 10.10.23 11:42 Сейчас в теме
Решение получилось такое:
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.КП КАК КП,
	ВТ.Тип КАК Тип,
	ВТ.Количество КАК Количество
ПОМЕСТИТЬ ВТ1
ИЗ
	ВТ КАК ВТ
ГДЕ
	ВТ.Тип = "А"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.КП КАК КП,
	ВТ.Тип КАК Тип,
	ВТ.Количество КАК Количество
ПОМЕСТИТЬ ВТ2
ИЗ
	ВТ КАК ВТ
ГДЕ
	ВТ.Тип = "Б"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ1.КП КАК КП,
	ВТ1.Тип КАК Тип,
	ВТ1.Количество КАК Количество,
	АВТОНОМЕРЗАПИСИ() КАК ИД
ПОМЕСТИТЬ ВТ_3
ИЗ
	ВТ1 КАК ВТ1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ2.КП КАК КП,
	ВТ2.Тип КАК Тип,
	ВТ2.Количество КАК Количество,
	АВТОНОМЕРЗАПИСИ() КАК ИД
ПОМЕСТИТЬ ВТ_4
ИЗ
	ВТ2 КАК ВТ2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	А1.КП КАК КП,
	А1.Тип КАК Тип,
	А1.Количество КАК Количество,
	КОЛИЧЕСТВО(А1.ИД) КАК НПП
ПОМЕСТИТЬ ВТ_А
ИЗ
	ВТ_3 КАК А1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_3 КАК А2
		ПО А1.КП = А2.КП
			И А1.ИД >= А2.ИД

СГРУППИРОВАТЬ ПО
	А1.КП,
	А1.Тип,
	А1.Количество
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	А1.КП КАК КП,
	А1.Тип КАК Тип,
	А1.Количество КАК Количество,
	КОЛИЧЕСТВО(А1.ИД) КАК НПП
ПОМЕСТИТЬ ВТ_Б
ИЗ
	ВТ_4 КАК А1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_4 КАК А2
		ПО А1.КП = А2.КП
			И А1.ИД >= А2.ИД

СГРУППИРОВАТЬ ПО
	А1.КП,
	А1.Тип,
	А1.Количество
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫБОР
		КОГДА ВТ_А.КП ЕСТЬ NULL
			ТОГДА ВТ_Б.КП
		ИНАЧЕ ВТ_А.КП
	КОНЕЦ КАК КП,
	ВТ_А.Тип КАК Тип,
	ВТ_А.Количество КАК Количество,
	ВТ_Б.Тип КАК Тип1,
	ВТ_Б.Количество КАК Количество1
ИЗ
	ВТ_А КАК ВТ_А
		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Б КАК ВТ_Б
		ПО ВТ_А.КП = ВТ_Б.КП
			И ВТ_А.НПП = ВТ_Б.НПП
Показать
24. Said-We 10.10.23 11:45 Сейчас в теме
(23) Пронумеровать с группировкой по полям можно за два прохода. Аналог "PARTITION by".
Можно не разбивать на кучу временных таблиц. Прям всё в одной.
Завтра кроме А и Б появится В, Г, Д - и писать почти не придется. А в вашем случае придется.
25. user-z99999 67 10.10.23 11:50 Сейчас в теме
(24)
Прям всё в одной.

Покажите пожалуйста как это сделать?
26. Said-We 10.10.23 12:06 Сейчас в теме
(25) Если кратко, то нумеруете всё в порядке таком же как писали бы в "PARTITION by". В подзапрос и находите минимум по каждой группировке. Далее просто арифметика текущий номер минус минимум по текущей группировке + 1.
Это если коротко суть.
27. Said-We 10.10.23 13:19 Сейчас в теме +0.2 $m
(25) Ниже два запроса. Один оконная функция нумерации по группировкам. И тоже самое только сначала сплошная нумерация, а потом расчет npp_gr как нумерации по группировкам (+40% времени на данном коротком и маленьком примере).
Саму нумерацию можно сделать без row_number().

Извращаться можно до бесконечности.
Можно на ассемблере написать программу не использую команду MOV, только не понятно зачем так делать.
Прикрепленные файлы:
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот