2016-09-26 2 views
-1

Я пытаюсь создать набор результатов, используя три запроса. У меня три таблицы: таблица инвентаря, таблица заказа формы и таблица подробных данных формы. Мне нужно иметь возможность вводить диапазон дат и получать, сколько форм было заказано, сколько в текущем инвентаре и сколько было уничтожено, если они содержат дату уничтожения. В конечном итоге я хочу получить результирующий набор, который показывает:Создать один результат из трех разных запросов

InventoryId, FormDescription, Product, Ordered, Shipped, Destroyed, Total ending 

Что было бы лучшим способом получить этот набор результатов, используя эти запросы?

Это мои три Запросы

SELECT FOD.InventoryId, SUM(FOD.FormOrderAmount) as totalOrdered, FOD.FormShippedAmount FROM tblFormOrder FMO 
JOIN tblFormOrderDetails FOD ON FOD.FormOrderId = FMO.FormOrderId 
WHERE FMO.OrderDateTime BETWEEN '20110101' and '20120101' 
AND FMO.OrderStatus IN ('S') 
GROUP BY FOD.InventoryId, FOD.FormShippedAmount -- total shipped by date and inventoryid 



SELECT INV.InventoryId, SUM(INV.CurrentAmount) as currentAmount, SUM(INV.OrderAmount) as OrderAmount, 
(SUM(INV.OrderAmount) - SUM(INV.CurrentAmount)) as InventoryUsed 
FROM tblInventory INV 
where INV.CreatedOn 
BETWEEN '20110101' and '20120101' 
GROUP BY INV.InventoryId -- current amount based off ordered and used 



select INV.InventoryId, count(*) as total 
, FMO.OrderDateTime as OrderDate, Inv.FormNo, INV.FormDescription, INV.Product 
from [tblinventory] INV 
join tblformorderdetails FOD ON FOD.InventoryId = inv.InventoryId 
join tblformorder FMO on FMO.FormOrderId = FOD.FormOrderId 
where INV.DestructionDate 
BETWEEN '20110101' and '20120101' 
group by 
FMO.OrderDateTime, 
Inv.FormNo, INV.FormDescription, INV.Product, INV.InventoryId -- using count to find how many destroyed if they have a destruction date 
+0

Присоединиться к запросам. – Barmar

+0

@ Бармар, это то, что я не уверен, как это сделать. –

+2

'SELECT * FROM (query1) AS q1 JOIN (query2) AS q2 ON q1.InventoryID = q2.InventoryID JOIN (query3) AS q3 ВКЛ q1.InventoryID = q3.InventoryID' – Barmar

ответ

1

Сделайте каждый запрос подзапросом, с которым вы объединяетесь.

SELECT * 
FROM (
    SELECT FOD.InventoryId, SUM(FOD.FormOrderAmount) as totalOrdered, FOD.FormShippedAmount FROM tblFormOrder FMO 
    JOIN tblFormOrderDetails FOD ON FOD.FormOrderId = FMO.FormOrderId 
    WHERE FMO.OrderDateTime BETWEEN '20110101' and '20120101' 
    AND FMO.OrderStatus IN ('S') 
    GROUP BY FOD.InventoryId, FOD.FormShippedAmount -- total shipped by date and inventoryid 
) AS q1 
LEFT JOIN (
    SELECT INV.InventoryId, SUM(INV.CurrentAmount) as currentAmount, SUM(INV.OrderAmount) as OrderAmount, 
    (SUM(INV.OrderAmount) - SUM(INV.CurrentAmount)) as InventoryUsed 
    FROM tblInventory INV 
    where INV.CreatedOn 
    BETWEEN '20110101' and '20120101' 
    GROUP BY INV.InventoryId -- current amount based off ordered and used 
) AS q2 ON q1.InventoryId = q2.InventoryId 
LEFT JOIN (
    select INV.InventoryId, count(*) as total 
    , FMO.OrderDateTime as OrderDate, Inv.FormNo, INV.FormDescription, INV.Product 
    from [tblinventory] INV 
    join tblformorderdetails FOD ON FOD.InventoryId = inv.InventoryId 
    join tblformorder FMO on FMO.FormOrderId = FOD.FormOrderId 
    where INV.DestructionDate 
    BETWEEN '20110101' and '20120101' 
    group by 
    FMO.OrderDateTime, 
    Inv.FormNo, INV.FormDescription, INV.Product, INV.InventoryId -- using count to find how many destroyed if they have a destruction date 
) AS q3 ON q1.InventoryId = q3.InventoryId 
+0

Обратите внимание, что это может пропустить некоторые элементы, если они выходят в tblinventory, но не в tblformorderdetails. Вероятно, это не проблема в этом случае, но может быть проблемой с этой техникой. – Hogan

+1

@ Хоган Правильно. Ваша версия, вероятно, более безопасна в этом отношении. – Barmar

2

Если вы хотите внутреннее соединение вы можете сделать это

SELECT * 
FROM (...) AS Q1, (...) AS Q2, (...) AS Q3 
WHERE Q1.InventoryID = Q2.InventoryID AND Q2.InventoryID = Q3.InventoryID 

Это только даст вам InventoryIDs, которые во всех 3-х запросов.

Возможно, вы не хотите этого, вы, вероятно, хотите, чтобы все идентификаторы инвентаря ... так вы это делаете.

SELECT * 
FROM (SELECT DISTINCT InventoryID FROM tblFormOrderDetails 
     UNION ALL 
     SELECT DISTINCT InventoryID FROM tblInventory) I 
LEFT JOIN (...) Q1 ON I.InventoryID = Q1.InventoryId 
LEFT JOIN (...) Q2 ON I.InventoryID = Q2.InventoryId 
LEFT JOIN (...) Q3 ON I.InventoryID = Q3.InventoryId 
Смежные вопросы