计算产品,价格和日期之间的差异T_SQL

时间:2013-02-06 14:59:54

标签: sql sql-server tsql report variance

我已经阅读了stackoverflow上的几篇帖子,试图确定计算项目表的时间跨度内价格差异的最佳路径。我的ITEM_NO,月份和年份都在同一个表格中以及单位成本。基本上,我在这里有一些示例数据:

DECLARE    @Inventory TABLE (Month NUMERIC, Year NUMERIC, ItemNumber NUMERIC, Cost DECIMAL)

INSERT     @Inventory
SELECT     '01', '12', '0001', '1.05' 
SELECT     '02', '12', '0001', '1.05' 
SELECT     '03', '12', '0001', '1.02' 
SELECT     '02', '12', '0002', '1.25' 
SELECT     '03', '12', '0003', '1.55'
SELECT     '03', '12', '0003', '1.57'
SELECT     '03', '12', '0003', '1.61'
SELECT     '03', '12', '0002', '1.29'

基本上,输出将是

Item Number |  Current Cost  |  % Change  |  Month  | Year
-----------------------------------------------------------
       0001 |           1.02 |       0.01 |      02 |    12

如果这是一种很好的方式。我只是在寻找一种计算价格差异的方法。由于此表有大约600,000行,并且item_number以不同的价格重复多次(每月或每隔几个月不同),因此生成报告会很好。我并不是一个全新的SQL,但对T_SQL来说有点新,并试图围绕这个想法。

我试过了:

USE BWDW; -- database
GO
SELECT ITEM_NO AS 'Item Number', TXN_YR AS 'Year', TXN_MON AS 'Month', UNIT_COST AS 'Item Price', STDEV(UNIT_COST) AS 'Variance Price'
FROM DS_tblFactInventoryTxnHistory
GROUP BY ITEM_NO, TXN_YR, TXN_MON, UNIT_COST
ORDER BY ITEM_NO;
GO   

其中输出为:

Item Number Year    Month   Item Price  Variance Price
02009739        11  11  6180.0000   0
02009779        11  11  5459.0000   0
104415          12  8   0.0618  0
104415          12  9   0.0618  NULL
104650          11  5   1.0000  0
104650          11  7   1.0000  0
104650          11  8   0.2575  NULL
104650          11  10  0.2575  0
104650          11  12  0.0319  NULL
104650          11  12  0.1071  0
104650          11  12  0.1823  0
104650          11  12  0.2575  0
104650          12  8   0.0319  1.07539867831324E-09
104650          12  9   0.0319  1.57825377906919E-09

对于最终美元的东西,似乎有很多小数。我知道我可以围绕最后一栏。我一直在阅读有关MSDN上的STDEV,网站上的各种来源以及sqlteam网站上的DATEDIFF解释。

这可能是一个全新的问题,我很感激任何人都可以提供帮助以实现我的目标。

1 个答案:

答案 0 :(得分:1)

你真的不想要这样的东西:

SELECT
            ITEM_NO ItemNumber,
            TXN_YR Year,
            TXN_MON Month,
            AVG(UNIT_COST) AveragePrice,
            VAR(UNIT_COST) PriceVarianceInMonth
    FROM
            DS_tblFactInventoryTxnHistory
    GROUP BY
            ITEM_NO,
            TXN_YR,
            TXN_MON
    ORDER BY
            ITEM_NO,
            TXN_YR,
            TXN_MON

它将提供更有意义的数据。


本质上,group子句用于将数据分成组。在我的查询中,我按ITEM_NOTXN_YRTXN_MON对数据进行分组。结果应该为每个月的每个项目分组。 UNIT_COST可能因组中的每个成员而异。

在结果中,我可以将聚合函数应用于组,以允许我表达该组的某些属性。在我的示例中,我返回组的平均单位成本以及组的统计方差。

因此,结果集中的每一行都会为每个组包含一行,包括:

  • ITEM_NO
  • TXN_YR
  • TXN_MON
  • 该月的平均UNIT_COST
  • 该月UNIT_COST的差异