解析左连接查询,返回20作为QTY,其中10是预期的QTY

时间:2017-12-19 07:16:51

标签: sql sql-server

处理一个查询,该查询返回MRP和价格的不同值,并通过QTY返回。在这里我有一个名为Profit的旗帜,标记为' 1'我需要总结销售报告和采购报告中的所有数量,差异应为10.但实际值为20

我尝试的查询如下

SELECT
  CAST(dp.[MRP] AS numeric(18, 2)) AS [MRP],
  CAST(dp.[PRICE] AS numeric(18, 2)) AS [RETAIL],
  CAST(dp.[CP] AS numeric(18, 2)) AS [COST],
  SUM(CAST(dp.[QUANTITY] AS numeric(18, 2))) - ISNULL(SUM(CAST(ds.[QTY] AS numeric(18, 2))), 0) AS [QTY]
FROM [iBillDB].[dbo].[DETAILPURCHASES] dp
LEFT JOIN [iBillDB].[dbo].[DETAILSALE] ds
  ON CAST(dp.MRP AS numeric(18, 2)) = CAST(ds.MRP AS numeric(18, 2))
  AND dp.ITEMN = ds.itemn
WHERE dp.ITEMN = '1'
AND dp.PROFIT = '1'
AND ds.PROFIT = '1'
GROUP BY dp.mrp,
         dp.PRICE,
         dp.CP
HAVING SUM(CAST(dp.[QUANTITY] AS numeric(18, 2))) - ISNULL(SUM(CAST(ds.[QTY] AS numeric(18, 2))), 0) > 0

我正在研究的表是:

详情销售:

ID  SN  B  ITEMN  BARCODE  ITEMNAME  CP     QTY     UOM  MRP    PRICE   PROFIT  NETAMOUNT  
1   1   0  1      0001     sample    150.0   10.00  PCS  150.0  150.00  1        1500.00    
2   1   0  1      0002     sample    120.0   10.00  PCS  120.0  120.00  1        1200.00    
3   1   0  1      0003     sample    100.0   10.00  PCS  100.0  100.00  1        1000.00    
4   1   0  1      0004     sample    100.0  -10.00  PCS  100.0  100.00  2        1000.00    
6   1   0  1      0004     sample    100.0  -10.00  PCS  100.0  100.00  2       -1000.00   
7   1   0  1      0005     sample    100.0  -10.00  PCS  100.0  100.00  2       -1000.00   
8   1   0  1      0005     sample    100.0  -10.00  PCS  100.0  100.00  2       -1000.00   
9   1   0  1      0006     sample    100.0  -10.00  PCS  100.0  100.00  1        1000.00    

表2:

详细购买:

ID  SN  ITEMN  BARCODE  ITEMNAME  CP      QUANTITY  UOM  MRP    PRICE  PROFIT  SHIPPING  NETAMOUNT  
1   1   1      0001     sample    100.00  10.0      PCS  100.0  100.0  1       00.0      1000.00    
2   1   1      0002     sample    120     10.0      PCS  120.0  120.0  1       00.0      1200.00    
3   1   1      0003     sample    150     10.0      PCS  150.0  150.0  1       00.0      1500.00    

利润标志用于销售和销售回收,即,如果QTY为Postive,则为销售,负数量为销售退货。我的查询应总结所有销售和销售回报,使其显示净可用数量。

提前致谢。对不起,如果我的细节令人困惑。如果需要,将提供进一步的说明。

获得的结果查询是:

MRP     RETAIL  COST    QTY
100.00  100.00  100.00  20.00

4 个答案:

答案 0 :(得分:2)

SELECT
  CAST(dp.[MRP] AS numeric(18, 2)) AS [MRP],
  CAST(dp.[PRICE] AS numeric(18, 2)) AS [RETAIL],
  CAST(dp.[CP] AS numeric(18, 2)) AS [COST],
  SUM(CAST(dp.[QUANTITY] AS numeric(18, 2))) 
                     - ISNULL(SUM(CAST(ds.[QTY] AS numeric(18, 2))), 0) AS [QTY]
FROM [iBillDB].[dbo].[DETAILPURCHASES] dp
LEFT JOIN [iBillDB].[dbo].[DETAILSALE] ds
  ON CAST(dp.MRP AS numeric(18, 2)) = CAST(ds.MRP AS numeric(18, 2))
    AND dp.ITEMN    = ds.itemn
    AND dp.ITEMN    = '1'
    AND dp.PROFIT   = '1'
    AND ds.PROFIT   = '1'     --<-- Instead of "where" keep this in "ON" clause
    -- Also use Select expression in the group by
GROUP BY CAST(dp.[MRP] AS numeric(18, 2)),
         CAST(dp.[PRICE] AS numeric(18, 2)),
         CAST(dp.[CP] AS numeric(18, 2))
HAVING SUM(CAST(dp.[QUANTITY] AS numeric(18, 2))) 
                        - ISNULL(SUM(CAST(ds.[QTY] AS numeric(18, 2))), 0) > 0

答案 1 :(得分:1)

只需使用OUTER APPLY检索所需的输出即可。实际上你的表格设计不太适合LEFT JOIN所以它从[DETAILPURCHASES]返回的重复值应该返回3行而是返回4行,所以尝试下面的查询它将是在这种情况下非常好的方法

SELECT
  CAST(dp.[MRP] AS numeric(18, 2)) AS [MRP],
  CAST(dp.[PRICE] AS numeric(18, 2)) AS [RETAIL],
  CAST(dp.[CP] AS numeric(18, 2)) AS [COST],
  SUM(CAST(dp.[QUANTITY] AS numeric(18, 2)) - ds.[QTY]) AS [QTY]
FROM [iBillDB].[dbo].[DETAILPURCHASES] dp
OUTER APPLY(SELECT ISNULL(SUM(CAST(ds.[QTY] AS numeric(18, 2))), 0) qty 
            FROM [iBillDB].[dbo].[DETAILSALE] ds
            WHERE CAST(dp.MRP AS numeric(18, 2)) = CAST(ds.MRP AS numeric(18, 2))
            AND dp.ITEMN = ds.itemn
            AND dp.PROFIT = ds.PROFIT) ds
WHERE dp.ITEMN = '1'
AND dp.PROFIT = '1'
GROUP BY dp.mrp,
         dp.PRICE,
         dp.CP
HAVING SUM(CAST(dp.[QUANTITY] AS numeric(18, 2)) - ds.[QTY]) > 0

<强>输出:

MRP     RETAIL  COST    QTY
100.00  100.00  100.00  10.00

答案 2 :(得分:0)

我想我得到了答案,谢谢你的帮助

查询如下:

SELECT
  CAST(dp.[MRP] AS numeric(18,2)) AS [MRP],
  CAST(dp.[PRICE] AS numeric(18,2)) AS [RETAIL],
  CAST(dp.[CP] AS numeric(18,2)) AS [COST],
  (
    SELECT SUM(cast( quantity as numeric(18,2)))
    from [iBillDB].[dbo].[DETAILPURCHASES]
    where ITEMN = dp.itemn
    and cast([MRP] as numeric(18,2)) = CAST(dp.[MRP] AS numeric(18,2))
  ) -
  (
    SELECT SUM(cast( IGST as numeric(18,2)))
    from [iBillDB].[dbo].DETAILSALE
    where ITEMN = dp.ITEMN
    and cast([MRP] as numeric(18,2)) = CAST(dp.[MRP] AS numeric(18,2))
  )
FROM [iBillDB].[dbo].[DETAILPURCHASES] dp
WHERE dp.ITEMN = '1'
and
(
  SELECT SUM(cast( quantity as numeric(18,2)))
  from [iBillDB].[dbo].[DETAILPURCHASES]
  where ITEMN = dp.itemn
  and cast([MRP] as numeric(18,2)) = CAST(dp.[MRP] AS numeric(18,2))
) -
(
  SELECT SUM(cast( IGST as numeric(18,2)))
  from [iBillDB].[dbo].DETAILSALE
  where ITEMN = dp.ITEMN
  and cast([MRP] as numeric(18,2)) = CAST(dp.[MRP] AS numeric(18,2))
) > 0

答案 3 :(得分:0)

似乎您想要显示每个项目的两个表中的数量。所以建立总和,然后加入:

select 
  coalesce(p.itemn, s.itemn) as itemn,
  coalesce(p.qty, 0) as purchases,
  coalesce(s.qty, 0) as sales,
  coalesce(p.qty, 0) - coalesce(s.qty, 0) as rest
from
(
  select itemn, sum(quantity) as qty
  from detailpurchases
  where profit = 1
  group by itemn
) p
full outer join
(
  select itemn, sum(qty) as qty
  from detailsale
  where profit = 1
  group by itemn
) s on s.itemn = p.itemn;

这会为每个项目提供一个结果行。如果您希望每个项目有一行+ MRP +价格,请将其添加到GROUP BY子句和ON子句中。

如果您只想对项目1进行此查询,请在子查询中或最后添加where子句。