01.02.2023, 17:47 | #1 |
Участник
|
Хранимка, INSERT INTO ..SELECT (с GROUP by!!!), значение Line No
Всем добрый день!
1.Выгрузка для маркетплейса из выделенных в списке перемещений. Заказчик хочет группировку товаров по артикулу+цвету. Данные беру хранимкой и пишу в таблицу, в которой первичный ключ Document Type,Document No.,Line No_. Не могу корректно определить Line No_ в строке. Вот так ругается при выгрузке Violation of PRIMARY KEY constraint 'ххх$Export Documents$0'. Cannot insert duplicate key in object 'dbo.ххх$Export Documents'. 2.Сделала вот такую фн: USE [ххх] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <ххх> -- Create date: <2023-01-26, ,> -- Description: <нужна в хп [dbo].[rnd_export22y_transfer_group], где строки перемещ групп по артик товара+цвет и запись в т 50124 с ключом ... Строка Но> -- #SC-хх 2023-01-16 Выгрузка -- ============================================= ALTER FUNCTION [dbo].[GetLineNo] ( @LastLineNo int ) RETURNS int AS BEGIN RETURN (@LastLineNo + 10000) END в хп SET @line = 10000 Дальше надо как-то @line впихнуть в конструкцию INSERT INTO [ххх].[dbo].[ххх$Export Documents] ([Document Type] ,[Document No_] ...... SELECT @Type --(<Document Type, int,> ,@docGroup --docNo--<Document No_, varchar(30),> ,1--<State, int,> ,sl.[Shipment Date]--<DateTime, datetime,> ,sl.[Document No_]--<Vender, varchar(100),> .......... Что-то типа , @line = (select [dbo].[GetLineNo] (@line) ) чтобы и @line увеличилось, и в новую запись пошло увеличенное значение. Не получается использовать фн [dbo].[GetLineNo] ! ((((( 3. Я извернулась вот так: , (SELECT top 1 FLOOR(RAND(ART2.[Qty])*(ART2.[Line No_]))+ FLOOR(RAND(ART2.[Line No_])*(ART2.[Qty]))) [Line No] ART2.[Line No_] при группировке сумм по всем лайнам))) а ART2.[Qty] - по всем количествам в строках Пока работает. Может, кто-то решал подобную задачу, и может поделиться опытом? Спасибо! Последний раз редактировалось mira; 01.02.2023 в 17:54. |
|
01.02.2023, 22:21 | #2 |
Administrator
|
Не очень понял задачи. Нужно сгруппировать некоторые данные, а потом (уже сгруппированные) их пронумеровать? Если так - то это делается легко (Transact SQL)
X++: select salesid, itemid, sum(SalesQty) as SumQty, ROW_NUMBER() over(order by salesId) as LineNumber from salesline group by salesid, itemid Здесь функция ROW_NUMBER() - это штатная функция нумерации строк, а конструкция over (order by salesId) позволяет определить сортировку, согласно которой будет выполняться нумерация. Например, можно указать вместо salesId - itemid и тогда результат будет несколько иной (другие строки получат номер 1, 2 и т.д.) Если это не то, что нужно - то я не понял задачи. Свои (невстроенные) функции в SQL использовать нужно аккуратно. Они не самые "шустрые" в плане исполнения.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 02.02.2023 в 14:04. |
|
|
За это сообщение автора поблагодарили: mira (1). |
02.02.2023, 11:42 | #3 |
Участник
|
Цитата:
Сообщение от sukhanchik
Не очень понял задачи. Нужно сгруппировать некоторые данные, а потом (уже сгруппированные) их пронумеровать? Если так - то это делается легко (Transact SQL)
X++: select salesid, itemid, sum(SalesQty) as SumQty, ROW_NUMBER() over(order by salesId) as LineNumber from salesline group by salesid, itemid Получилось и шустренько так выгрузилось в отличие от моего варианта |
|
|
|