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

问题描述 投票:1回答:4

处理一个查询,该查询返回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    

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

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

我得到的结果查询是:

MRP     RETAIL  COST    QTY
100.00  100.00  100.00  20.00
sql sql-server
4个回答
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
投票

只需使用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

OUTPUT:

MRP     RETAIL  COST    QTY
100.00  100.00  100.00  10.00

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

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子句。

© www.soinside.com 2019 - 2024. All rights reserved.