处理一个查询,该查询返回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
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
只需使用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
我想我的答案谢谢你的帮助
查询看起来像:
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
您似乎想要显示每个项目的两个表的数量。所以建立总和,然后加入:
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子句。