Ответы пользователя по тегу SQL
  • У кого быстрей запрос на дерево в MS SQL?

    @Noob_001 Автор вопроса
    чтение данных для для формирования дерева и развертывание полной структуры 2 запроса:

    1
    af7d07587265496292f7e14d7a161586.JPG
    2
    ce17fa244b564c8287e500120ef3772b.JPG
    3 ну, вот так сие выглядит:
    68c5f88c5b5d4ccbb2d3a1b33032ed5d.JPG
    Ответ написан
    Комментировать
  • Как сделать ИМ с товарами-комплектами?

    @Noob_001
    [товар] - [цены в датах] - [группа скидок] (сроки, количество, общая цена, дата с, дата по) - [варианты комплектов] (через набор скидок + цена с учетом скидки в группе) + [дополнительные бонусы ... есть\нету. или дополнительные товары в виде бонуса]
    где-то еще ... постоянные клиенты, карты скидок сети, место хранения, сроки поставки (комплектов или товара) и т.п.
    Ответ написан
    Комментировать
  • Какие вам дают вопросы на собеседовании?

    @Noob_001 Автор вопроса
    А теперь все одной процедурой и без временных таблиц как хотели многие :) ...

    IF OBJECT_ID ( '_data_look', 'P' ) IS NOT NULL 
        DROP PROCEDURE _data_look;
    GO
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE _data_look (@item int,@item_in int,@item_out int,@v int,@x nvarchar(max))
    AS 
    BEGIN
    if @x = 'движение'
    	if 	(@item_in <> @item_out) and (@item_in + @item_out > 0) and (@v >= 0)
    	begin
    	DECLARE @follow	int
    	SET @follow = 	(
    						case 
    							when @item_in = 0 and  @item_out > 0 then  1
    							when @item_in > 0 and  @item_out = 0 then -1
    							when @item_in > 0 and  @item_out > 0 then  0
    						end
    					)
    		if @follow = 1
    				if (select SUM(Количество) from _Размещение where Место = @item_out) is null
    					begin
    					BEGIN  TRANSACTION;
    						insert into _Движение   values (@item,@item_in,@item_out,@v)
    						insert into _Размещение values (@item,@item_out,@v)
    					COMMIT TRANSACTION;		
    					end
    				else
    					begin
    					BEGIN  TRANSACTION;
    						insert into _Движение   values (@item,@item_in,@item_out,@v)
    						update _Размещение
    						set Количество = Количество + @v
    						where Место = @item_out
    					COMMIT TRANSACTION;	
    					end
    			if @follow = -1
    				if (select SUM(Количество) from _Размещение where Место = @item_in) is null return;
    				else
    				begin
    					if (select Количество  - @v from _Размещение where Место = @item_in) < 0 return;
    					BEGIN  TRANSACTION;
    						insert into _Движение   values (@item,@item_in,@item_out,@v)
    						update _Размещение
    						set Количество = Количество - @v
    						where Место = @item_in
    					COMMIT TRANSACTION;	
    				end
    			if @follow = 0
    				if (select SUM(Количество) from _Размещение where Место = @item_in) is null or (select Количество - @v from _Размещение where Место = @item_in) < 0  return;
    				else
    				begin
    				if (select SUM(Количество) from _Размещение where Место = @item_out) is null 
    					begin 
    					BEGIN  TRANSACTION;
    					insert into _Размещение values (@item,@item_out,0)	
    					COMMIT TRANSACTION;	
    					end
    				BEGIN  TRANSACTION;
    					insert into _Движение   values (@item,@item_in,@item_out,@v)
    					update _Размещение
    						set Количество = Количество - @v
    						where Место = @item_in
    					update _Размещение
    						set Количество = Количество + @v
    						where Место = @item_out
    				COMMIT TRANSACTION;		
    				end			
    	end
    	else 
    		return;
    if @x = 'изменение'
    	begin
    
    		BEGIN  TRANSACTION;
    		
    		update _Движение
    		set Количество = @v
    		where	Товар		= @item		and
    				Откуда		= @item_in	and
    				Куда		= @item_out
    		
    		
    		update _Размещение
    		set Количество = 
    			(select case when sum(Количество) is null then 0 else sum(Количество) end from _Движение where Куда =  @item_out)
    			-
    			(select case when sum(Количество) is null then 0 else sum(Количество) end from _Движение where Откуда =  @item_in)
    		where Место = @item_out 
    		
    		COMMIT TRANSACTION;	
    	end
    if @x = 'снести N'
    begin
    
    		BEGIN  TRANSACTION;
    		
    		delete from _Движение
    		where 
    				Товар		= @item		and
    				(
                                     Откуда		= @item_out	
                                     or  
                                     Куда		= @item_out
                                     )
    				
    		delete from _Размещение
    		where 
    				Товар		= @item		and
    				Место		= @item_out
    
    
    		COMMIT TRANSACTION;	
    	end	
    END
    GO
    
    /*=================================*/
    /*=================================*/
    
    /* собственно психи одиночки, а можно в цикле + табличка */
    exec _data_look 1, 0, 3, 10,   'движение'
    exec _data_look 1, 0, 2, 5,     'движение'
    exec _data_look 1, 2, 3, 5,     'движение'
    exec _data_look 1, 0, 3, 100, 'изменение'   
     /* а тут меняем данные первого exec на 100 и пересчитываем результат, 
    но тут на отрицательное не ставил условие- забил :) */
    exec _data_look 1, 2, 3, 4,  'снести N'
    /* сносим вообще всю историю со складом 3 */
    
    select * from _Движение
    select * from _Размещение
    /*
    truncate table _Движение
    truncate table _Размещение
    */
    Ответ написан
  • Как собрать данные в одну строку в ms sql?

    @Noob_001
    select 
    z.Nomer,
    (
       SELECT distinct Name + CHAR(10) FROM  #product p 
       where  p.ID in (select n.ProduktID from #nakladnaya n where n.ZakazNomer = z.Nomer) 
       FOR xml path('')
    ) 'names'
    from #zakaz z
    inner join #nakladnaya n on n.ZakazNomer = z.Nomer
    group by z.Nomer
    
    /* вместо #тбличка ... подставь свои таблицы, а далее жмякай F5 */
    Ответ написан
  • Как выбрать всю таблицу зная её имя?

    @Noob_001
    DECLARE @SQL varchar(MAX), @table_name varchar(max)
    SET @table_name = 'dbo.Имя таблички'
    SET @SQL = 'SELECT top 10 * FROM ' + @table_name
    exec(@SQL)

    дерзай :)
    Ответ написан
    Комментировать