处理一个查询,该查询返回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
答案 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子句。