Member 14108724 Ответов: 1

Как вычесть два поля двух разных таблиц из одного поля третьей таблицы?


У меня есть три стола StoreProducts [Productid, ProdQuantity, DateIn], Примеси[ImpID,ImpQTY,DateOut] и Заказ[OrdID,OrdQTY,OrdDate.

Теперь я хочу, чтобы вычесть ImQTY и то из ProdQuantiy таблицы StoreProducts и отображения имеющихся на данный момент столбец productquantity. В DataGridView или в CrystalReport с помощью C# Visual Studio.

Что я уже пробовал:

Я пытаюсь использовать SQL-запрос в Crystal Report.

Member 14108724

ПОЛЕ STOREID КОДСОТРУДНИКА VEHICLEID КОДТОВАРА ПАРАМЕТР PRODUCTTYPE PRODUCTQTY ЦЕНЕ МЕСТО, ДАТА,
1 20001 2424 10001 UCO 30 6500 1 ЯНВАРЯ-19 МАНЧЕСТЕР

1 20002 3366 20001 КИСЛОТНОЕ МАСЛО 20 4500 1 ЯНВ-19 МАНЧЕСТЕР

2 20008 2424 10001 UCO 17 3250 1 ЯНВАРЯ-19 БИРМИНГЕМ

3 --- --- ---- --- --- --- --- ---


ПРИМЕСИ


IMPURITYID EMPLOYEEID STOREID PRODUCTID IMPURITYTYPE IMPURITYQTY DATEOUT

30001 20001 1 10001 Вода 5 2 января-19





ЗАКАЗЫ

ORDID PRODUCTID CUSTID ORDERQTY ORDDATE COST

90001 10001 500001 10 3 января-19 2160



Я хочу, чтобы оставшееся количество продукта (например, 32 ) после исключения примесей и выполнения заказа было выполнено.

то есть 47 - 5 = 42 ----> После примеси

42 - 10 = 32 ----> После заказа

1 Ответов

Рейтинг:
4

Wendelius

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

SELECT  sp.Productid,
        sp.ProdQuantity,
        i.ImpAmount,
        o.OrderAmount,
        sp.ProdQuantity 
           - COALESCE(i.ImpAmount, 0) 
           - COALESCE(o.OrderAmount, 0) AS Amount
FROM StoreProducts sp 
LEFT JOIN (SELECT i2.Productid,
                  SUM(i2.ImpQTY) AS ImpAmount
           FROM Impurities i2
           GROUP BY i2.Productid) i ON i.Productid = sp.Productid
LEFT JOIN (SELECT o2.Productid,
                  SUM(o2.OrdQTY) AS OrderAmount
           FROM Order o2
           GROUP BY o2.Productid) o ON o.Productid = sp.Productid


РЕДАКТИРОВАТЬ:

Добавлен тестовый случай

CREATE TABLE StoreProducts (
   Productid int,
   ProdQuantity int
);

CREATE TABLE Impurities (
   Productid int,
   ImpQTY    int
);

CREATE TABLE Orders (
   Productid int,
   OrdQTY    int
);

INSERT INTO StoreProducts (ProductId, ProdQuantity) VALUES
 (1, 100),
 (2, 100),
 (3, 100),
 (4, 100);

INSERT INTO Impurities (Productid, ImpQTY) VALUES 
 (1, 10),
 (2, 20);

 INSERT INTO Orders (Productid, OrdQTY) VALUES 
 (1, 2),
 (3, 3);

SELECT  sp.Productid,
        sp.ProdQuantity,
        i.ImpAmount,
        o.OrderAmount,
        sp.ProdQuantity 
           - COALESCE(i.ImpAmount, 0) 
           - COALESCE(o.OrderAmount, 0) AS Amount
FROM StoreProducts sp 
LEFT JOIN (SELECT i2.Productid,
                  SUM(i2.ImpQTY) AS ImpAmount
           FROM Impurities i2
           GROUP BY i2.Productid) i ON i.Productid = sp.Productid
LEFT JOIN (SELECT o2.Productid,
                  SUM(o2.OrdQTY) AS OrderAmount
           FROM Orders o2
           GROUP BY o2.Productid) o ON o.Productid = sp.Productid

С приведенным выше тестовым материалом результат таков:
Productid   ProdQuantity   ImpAmount   OrderAmount   Amount
---------   ------------   ---------   -----------   ------
1           100            10          2             88
2           100            20          NULL          80
3           100            NULL        3             97
4           100            NULL        NULL          100


Member 14108724

Этот запрос вычитает количество примесей из всех количеств продукта.
Предположим у меня есть количество продукта 47 бочек в которых есть 5 банок примесей
Я хочу, чтобы оставшееся количество продукта после исключения примесей и выполнения заказа было исключено.

то есть 47 - 5 = 42 ----> После примеси

42 - 10 = 32 ----> После заказа

Wendelius

Не уверен, что полностью понимаю это требование. Насколько я вижу, примеси и заказы должны быть вычтены из каждого продукта запросом.

Не могли бы вы опубликовать примерные данные и ожидаемый результат?

Member 14108724

Приведенный выше запрос в порядке, но он вычитает такое же количество примесей из другого продукта. Возможно, в продукте не будет никаких примесей. хорошо, я собираюсь опубликовать примерные данные и ожидаемый результат.

Wendelius

Не уверен, что я все еще понимаю. Соединение выполняется с использованием productid, поэтому числа из другого продукта не должны влиять на другие продукты.

Я создал небольшой тестовый материал, чтобы продемонстрировать различные ситуации. Смотрите обновленное решение. Является ли результат тем, что вы ожидаете?

Member 14108724

STOREPRODUCTS

ПОЛЕ STOREID EMPID В VEHID ПРОДУКТА PRODTYPE ЦЕНЕ PRODTQTY МЕСТОПОЛОЖЕНИИ ДАТА,
1 20001 2424 10001 UCO 30 6500 1 ЯНВАРЯ-19 МАНЧЕСТЕР

1 20002 3366 20001 КИСЛОТНОЕ МАСЛО 20 4500 1 ЯНВ-19 МАНЧЕСТЕР

2 20008 2424 10001 UCO 17 3250 1 ЯНВАРЯ-19 БИРМИНГЕМ

ПРИМЕСИ

IMPURITYID EMPID STOREID PRODTID IMPURIYTYPE IMPURITYQTY DATEOUT

30001 20001 1 10001 Вода 5 2 января-19
ЗАКАЗЫ

ORDID PRODTID CUSTID ТО СТОИМОСТЬ ORDDATE

90001 10001 500001 10 3 января-19 2160
ЗАКАЗЫ

ORDID PRODTID CUSTID ТО СТОИМОСТЬ ORDDATE

90001 10001 500001 10 3 января-19 2160
Я хочу, чтобы оставшееся количество продукта после исключения примесей и выполнения заказа было исключено.

то есть 47 - 5 = 42 ----> После примеси

42 - 10 = 32 ----> После заказа
ProductID PRODUCTTYPE RODQUANTIY(Avalable) дата
10001 UCO 32 4 ЯНВАРЯ-2019
20001 КИСЛОТНОЕ МАСЛО 20 4 ЯНВАРЯ-2019