SQL-запрос с SUM, ORDER BY, с ограниченными значениями - PullRequest
1 голос
/ 10 октября 2019

У меня проблемы с получением ожидаемого результата.

Я успешно соединил 2 таблицы (база данных - SQL Server), однако мне хотелось бы иметь что-то большее.

Excel - этотаблица, которая содержит список PartNumbers(GBC) с соответствующими Quantity этой части, необходимой для сборки.

Я присоединяюсь к этому Excel с моей базой данных Inventory, чтобы получить информацию о том, что у меня есть, чего не хватает,что мне нужно купить.

Текущий запрос:

string sqlCheck = @"SELECT e.GBC, e.Replaced, e.Description, Barcode, Location, Bookstand, Quantity, Buildneed, p.Quantity - e.Buildneed as Afterbuild FROM Parts p Right JOIN Excel e ON e.GBC = p.GBC ORDER BY GBC ASC, Quantity DESC";

Результаты, как показано ниже:

enter image description here

Необходимо использовать ВСЕ дубликаты GBC, но в определенном порядке.

Сначала мне нужно взять GBC(86911) с Quantity = 100, это должно привести к Afterbuild = 0.

Но встолбец Buildneed Я вижу, что мне нужно всего 768, поэтому следующим шагом будет взять GBC(86911) с quantity = 500, это должно привести к Afterbuild 0, и в этой строке я хотел бы видеть новый столбец с именем Totals это будет равно -168 (что будет означать, что мне нужно купить 168 штук этой части).

  1. У меня может быть много одинаковых деталей с разными количествами
  2. Я всегда хочу начать с наименьшего количества для конкретного дублирующегося GBC
  3. Это не должно показывать мне больше GBC, если Buildneedзначение будет превышено

Ожидаемый вывод, как на изображении ниже:

Я добавил столбец 'UseInOrder' - , это не необходимость , но было бы здорово, если егоТакже возможно, это укажет мне на то, что мне нужно будет использовать все детали от каждого в этом порядке.

enter image description here

Как предлагается, нижеприведенные определения таблиц:

CREATE TABLE [dbo].[Excel] (
    [GBC]         INT          NULL,
    [Description] VARCHAR (50) NULL,
    [Buildneed]   INT          NULL,
    [Replaced]    VARCHAR (50) NULL
);

CREATE TABLE [dbo].[Parts] (
    [Barcode]       INT          IDENTITY (201900001, 1) NOT NULL,
    [GBC]           INT          NULL,
    [Description]   VARCHAR (50) NULL,
    [Location]      VARCHAR (50) NULL,
    [Bookstand]     VARCHAR (50) NULL,
    [Value]         VARCHAR (50) NULL,
    [Quantity]      INT          NULL,
    [MQuantity]     INT          NULL,
    [Manufacturer1] VARCHAR (50) NULL,
    [MPN1]          VARCHAR (50) NULL,
    [Manufacturer2] VARCHAR (50) NULL,
    [MPN2]          VARCHAR (50) NULL,
    [Manufacturer3] VARCHAR (50) NULL,
    [MPN3]          VARCHAR (50) NULL,
    CONSTRAINT [PK_Parts] PRIMARY KEY CLUSTERED ([Barcode] ASC)
);

РЕДАКТИРОВАТЬ Пример данных

declare @tblParts table(
  GBC int,
  Barcode varchar(256),
  [Location] varchar(256),
  Quantity int
)

declare @tblPartsUsed table(
  GBC int,
  Replaced varchar(1) default '',
  [Description] varchar(50),
  Buildneed int
)

insert into @tblParts (GBC,[Description], Barcode, [Location], Quantity)
select 86911, 'CAP_CER,10nF,0603,10%,100V,X7R' ,201901200, 'JD-01/  14' ,500
union all
select 86911, 'CAP_CER,10nF,0603,10%,100V,X7R' ,201901166, 'ESB-03' ,100
union all
select 99529, 'DIO_ZENR,5,6V,2%,MM3Z5V6ST1G,SOD323' ,201901024, 'ESB-01' ,100
union all
select 128082, 'CAP_CER,100nF,0603,10%,50V,X7R, poly' ,201901120, 'JD-01/  3' ,500
union all
select 128082, 'CAP_CER,100nF,0603,10%,50V,X7R, poly' ,201901121, 'JD-01/  3' ,500
union all
select 168078, 'CAP_CER,470nF,0805,10%,50V,X7R' ,201901207, 'JD-01/  19' ,170
union all
select 168078, 'CAP_CER,470nF,0805,10%,50V,X7R' ,201901152, 'ESB-03' ,140
union all
select 196881, 'BJT,C,SMBT3946DW1T1G,SOT363' ,201901085, 'ESB-02' ,100
union all
select 199296, 'BJT_DIG,C,SMUN5311DW1T1G,SOT363' ,201901083, 'ESB-02' ,100
union all
select 207735, 'DIO_LED, NFSA123DT' ,201902132, 'KRK' ,10


insert into @tblPartsUsed(GBC, [Description], Buildneed)
select 71744, 'RES_TF,10k,0402,1%,0,1W,100PPM/C' ,192
union all
select 71746, 'RES_TF,10k,0603,1%,0,1W,100PPM/C' ,168
union all
select 76527, 'CAP_CER,10nF,0402,10%,50V,X7R' ,288
union all
select 86911, 'CAP_CER,10nF,0603,10%,100V,X7R' ,1464
union all
select 92854, 'RES_TF,30k,0603,1%,0,1W,100PPM/C' ,72
union all
select 93018, 'RES_TF,68k,0603,1%,0,1W,100PPM/C' ,72
union all
select 95241, 'RES_TF,2k2,0402,1%,0,1W,100PPM/C' ,192
union all
select 95549, 'RES_TF,47k,0603,1%,0,1W,100PPM/C' ,72
union all
select 99529, 'DIO_ZENR,5,6V,2%,MM3Z5V6ST1G,SOD323' ,72
union all
select 112117, 'RES_TF,2k2,0603,1%,0,1W,100PPM/C' ,96
union all
select 126486, 'RES_TF,0R,0603' ,24
union all
select 128082, 'CAP_CER,100nF,0603,10%,50V,X7R, poly' ,72
union all
select 168078, 'CAP_CER,470nF,0805,10%,50V,X7R' ,72
union all
select 196200, 'BJT_DIG,N,PDTC114EU,SOT323' ,72
union all
select 196881, 'BJT,C,SMBT3946DW1T1G,SOT363' ,144
union all
select 199296, 'BJT_DIG,C,SMUN5311DW1T1G,SOT363' ,504
union all
select 199302, 'RES_TF,100R,0603,10%,0,1W,200PPM/C' ,72
union all
select 202047, 'UNI,N,PMPB215ENEA,DFN2020MD-6' ,72
union all
select 202054, 'DIO_LED,SPMWHT346EA3' ,648
union all
select 203509, 'CONN_HEADER,MOLEX,5023521100' ,24
union all
select 207735, 'DIO_LED, NFSA123DT' ,648
union all
select 207843, 'Thermistor,10k,0603,1%,NTC' ,24
union all
select 208252, 'FOOTPRINT_BOARD-IN,MOLEX,350220011' ,48
union all
select 212145, 'DIO_SIGN,200V,250mA,50nS,BAV21WSQ-7-F,SOD323' ,72

Исходя из этой даты, выходные данные должны быть такими, как на изображении ниже таблицы:

enter image description here

Ответы [ 2 ]

4 голосов
/ 11 октября 2019

Попробуйте это

РЕДАКТИРОВАТЬ2 (после изменения начальных данных)

SELECT distinct u.GBC,p2.Replaced, p2.Description, IIF(u.Afterbuild>0, MIN(p1.Barcode) OVER(PARTITION BY u.GBC), p1.Barcode) as Barcode, p1.Location, u.Quantity, u.Buildneed, 
CASE
  when (u.Total <0 AND p1.Barcode is NULL) OR (SUM(u.Quantity) OVER(PARTITION BY u.GBC) - u.Buildneed)>0 then u.Afterbuild
  else 0
end
as Afterbuild,
CASE
   when u.Total <0 AND p1.Barcode is NULL then ABS(u.Total)
   when (SUM(u.Quantity) OVER(PARTITION BY u.GBC) - u.Buildneed)>0 then u.Total
   else u.Total
END as Total FROM
(
    SELECT distinct b.GBC, b.Quantity, b.Buildneed, 
       case 
           when b.Total <0 then null
           when b.Total >=0 AND MIN(b.Quantity) OVER(PARTITION BY b.GBC) - b.Buildneed < 0 AND b.Quantity = MAX(b.Quantity) OVER(PARTITION BY b.GBC) then SUM(b.Quantity) OVER(PARTITION BY b.GBC) - b.Buildneed
           when b.Total >=0 AND MIN(b.Quantity) OVER(PARTITION BY b.GBC) - b.Buildneed >= 0 AND b.Quantity = MIN(b.Quantity) OVER(PARTITION BY b.GBC) then MIN(b.Quantity) OVER(PARTITION BY b.GBC) - b.Buildneed
       END AS Afterbuild,
       case 
           when b.Total >=0 then null
           when b.Total <0 AND b.RowNumber = MAX(b.RowNumber) OVER(PARTITION BY b.GBC) then b.Total 
       END AS Total
    FROM
    (
        select r.GBC, r.Quantity, r.Buildneed,
        (SUM(r.Quantity) OVER(PARTITION BY r.GBC)) - r.Buildneed as Total, ROW_NUMBER() OVER(order by r.GBC, r.Quantity) as RowNumber
        from 
        (
            SELECT e.GBC, ISNULL(Quantity,0) as Quantity, ISNULL(Buildneed,0) as Buildneed FROM @tblParts p RIGHT JOIN @tblPartsUsed e ON e.GBC = p.GBC
        ) as r
    ) as b
) as u 
left join @tblParts as p1 on u.GBC = p1.GBC and ISNULL(u.Quantity,0) = ISNULL(p1.Quantity,0)
left join @tblPartsUsed as p2 on u.GBC = p2.GBC and ISNULL(u.Buildneed,0) = ISNULL(p2.Buildneed,0)
where (u.Afterbuild is not null or u.Total is not null or u.Quantity - u.Buildneed < 0)
order by u.GBC, u.Quantity
2 голосов
/ 10 октября 2019

Согласно @RomaRuzich, этот вопрос требует ожидаемых результатов в виде таблицы. Также необходима структура таблицы Parts и Excel с некоторыми данными, чтобы прояснить вопрос. Сделал некоторые предположения и создал скрипт с результатами вывода.

объявить таблицу @tblParts (GBC int, штрих-код varchar (20), [местоположение] varchar (20), книжный стенд varchar (10) по умолчанию '', количество int)

объявить таблицу @tblPartsUsed(GBC int,Заменен varchar (1) по умолчанию '',[Описание] варчар (50),Buildneed int)вставить в @tblParts (GBC, Штрих-код, [Местоположение], Количество)выберите 72223, '', '', 0объединить всехвыберите 86911, «201901200», «JD-01 /», 500объединить всехвыберите 86911, «201901166», «JD-01/14», 100вставить в @tblPartsUsed (GBC, [Описание], Buildneed)выберите «72223», «RES_TF», 60объединить всехвыберите '86911', 'CAP_CER, 10nf, 0603', 768объединить всехвыберите '86911', 'CAP_CER, 10nf, 0603', 768

ВЫБЕРИТЕ различные e.GBC, e.Replaced, e. [Описание], Штрих-код, [Местоположение], Стойка для книги, Количество, Количество построек, p.Количество - Элемент постройки как Построение, x.TotalQuantity - Построить как итогиFROM @tblParts p Right JOIN @tblPartsUsed e ON e.GBC = p.GBCлевое соединение (выберите GBC, сумма (количество) TotalQuantity из группы @tblParts по GBC) xна e.GBC = x.GBCЗАКАЗАТЬ по e.GBC ASC, p.Quantity ASC

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...