Вычтите один столбец из одной таблицы, которая содержит данные двух типов - PullRequest
0 голосов
/ 28 сентября 2019

У меня две таблицы содержат столбец количества, они содержат столбец Разный Feed_type, как отобразить разницу количества

Select pm.Prod_ID,pm.Product_Name ,ISNULL(Sum(psd.Quantity),0) as Quantity
 into #MyTempTable1 from dbo.[TBL_ProductStock_Details] psd
 inner join dbo.Tbl_Product_master pm  on psd.Prod_ID=pm.Prod_ID where Feed_Type=0 
 GROUP BY  pm.Prod_ID,pm.Product_Name  

  IF OBJECT_ID('tempdb..#MyTempTable2') IS NOT NULL DROP TABLE #MyTempTable2
  Select pm.Prod_ID,pm.Product_Name ,ISNULL(Sum(psd.Quantity),0) as Quantity 
into #MyTempTable2 from dbo.[TBL_ProductStock_Details] psd 
inner join dbo.Tbl_Product_master pm  on psd.Prod_ID=pm.Prod_ID  where Feed_Type=1 
 GROUP BY  pm.Prod_ID,pm.Product_Name

IF OBJECT_ID('tempdb..#MyTempTable3') IS NOT NULL DROP TABLE #MyTempTable3          
SELECT #MyTempTable1.Prod_ID as Prod_ID,#MyTempTable1.Product_Name as Product_Name ,
ISNULL(#MyTempTable1.Quantity,0) -ISNULL(#MyTempTable2.Quantity,0) AS Quantity_Diff 
into #MyTempTable3 from #MyTempTable1 
join #MyTempTable2 on 1=1 and #MyTempTable1.Prod_ID=#MyTempTable2.Prod_ID ;  

Select * From #MyTempTable3 

1 Ответ

1 голос
/ 28 сентября 2019

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

SELECT 
    pm.Prod_ID,
    pm.Product_Name,
    ISNULL(SUM(CASE WHEN Feed_Type = 0 THEN psd.Quantity ELSE 0 END), 0)
        - ISNULL(SUM(CASE WHEN Feed_Type = 1 THEN psd.Quantity ELSE 0 END), 0) AS Quantity_Diff 
INTO #MyTempTable3
FROM 
    dbo.[TBL_ProductStock_Details] psd
    INNER JOIN dbo.Tbl_Product_master pm  
        ON psd.Prod_ID = pm.Prod_ID
WHERE Feed_type IN (0, 1)
GROUP BY 
    pm.Prod_ID,
    pm.Product_Name

В зависимости от распределения NULLs в столбце QuantityКроме того, можно также упростить с помощью одного SUM():

SELECT 
    pm.Prod_ID,
    pm.Product_Name,
    SUM(CASE 
        WHEN Feed_Type = 0 THEN ISNULL(psd.Quantity, 0) 
        ELSE -1 * ISNULL(psd.Quantity, 0) 
    END) AS Quantity_Diff 
INTO #MyTempTable3
FROM 
    dbo.[TBL_ProductStock_Details] psd
    INNER JOIN dbo.Tbl_Product_master pm  
        ON psd.Prod_ID = pm.Prod_ID
WHERE Feed_type IN (0, 1)
GROUP BY 
    pm.Prod_ID,
    pm.Product_Name

Примечание: рассмотрите возможность индексирования столбца Feed_type с таблицей, к которой он принадлежит;как вы спрашиваете, этого нельзя сказать, что делает его менее понятным.

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