我正在尝试跟踪我们在ERP软件中的一些购买行为。 简而言之,我想知道我们是否在一个月之前支付了一个价格并且本月有不同的价格,它应该返回2个采购订单,股票代码,价格和日期等。
我的代码
select DISTINCT(MStockCode), PurchaseOrder, MPrice, MOrigDueDate from PorMasterDetail
where MStockCode <>''
and YEAR(MOrigDueDate) = YEAR(GETDATE())
and month(MOrigDueDate) = month(GETDATE())
AND MPrice >'0'
ORDER BY MStockCode ASC
当我把它放在Sql Reporting Services中时,它会给出一个有效的输出(如下) 它显示了所有StockCodes,与下面的采购订单,支付价格和日期分组。
* 650-1757 $ 1,554.00
323639 $ 518.00 4/12/2014
323784 $ 518.00 22/12/2014
323787 $ 518.00 22/12/2014
0075-018 $ 175.33
323427 $ 59.04 3/12/2014
323498 $ 59.04 3/12/2014
323547 $ 57.25 17/12/2014
0075-042 $ 766.56
323456 $ 389.17 3/12/2014
323597 $ 377.39 17/12/2014
0075-050 $ 11.55
323476 $ 11.55 3/12/2014
0075-210 $ 19.50
323328 $ 9.75 3/12/2014
323417 $ 9.75 3/12/2014
在理想的输出中,它只会显示以下内容,因为它们具有不同的价格
0075-018 $ 175.33
323427 $ 59.04 3/12/2014
323498 $ 59.04 3/12/2014
323547 $ 57.25 17/12/2014
0075-042 $ 766.56
323456 $ 389.17 3/12/2014
323597 $ 377.39 17/12/2014
最好是将它放在子查询中,还是在SSRS中进行改进?
非常感谢任何帮助。
答案 0 :(得分:0)
我在这个例子中使用SQL Server 2008。
在问题中,您说您对两个月感兴趣,但在查询中,您仅查看当前月份并且效率相当低。因此,我明确添加了两个参数来定义您感兴趣的日期范围。
CTE_Changed获取MStockCode
s的列表,其价格在给定的日期范围内(包括)发生变化。然后,您只需检索找到MStockCode
的所有必要详细信息。
我认为MPrice列的类型为money
,而不是char
类型,所以我将比较更改为> 0
而不是> '0'
。
DECLARE @ParamStartDate date = '2014-11-01';
DECLARE @ParamEndDate date = '2014-12-31';
WITH
CTE_Changed
AS
(
SELECT
MStockCode
FROM
PorMasterDetail
WHERE
MStockCode <> ''
AND MOrigDueDate >= @ParamStartDate
AND MOrigDueDate <= @ParamEndDate
AND MPrice > 0
GROUP BY
MStockCode
HAVING
MIN(MPrice) <> MAX(MPrice)
)
SELECT
PorMasterDetail.MStockCode
,PorMasterDetail.PurchaseOrder
,PorMasterDetail.MPrice
,PorMasterDetail.MOrigDueDate
FROM
CTE_Changed
INNER JOIN PorMasterDetail ON PorMasterDetail.MStockCode = CTE_Changed.MStockCode
ORDER BY PorMasterDetail.MStockCode