如何在结果集中显示价格差异(采购订单定价)

时间:2014-12-19 04:30:47

标签: sql-server reporting-services grouping aggregate-functions

我正在尝试跟踪我们在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中进行改进?

非常感谢任何帮助。

1 个答案:

答案 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