查询以表示重要日期的总价值

时间:2011-02-16 01:32:29

标签: sql-server-2005

如果某个表格显示特定日期的广告资源中各个项目的值,那么如何返回反映每个唯一日期的总价值的摘要数据?

例如,给定以下结构:

DECLARE @INVENTORY TABLE(
  EFFECTIVE_DATE DATE NOT NULL,
  ITEM INT NOT NULL,
  VALUE DECIMAL(6,2) NOT NULL
)
INSERT @INVENTORY VALUES ('2011-01-01', 1, 40.01)
INSERT @INVENTORY VALUES ('2011-01-01', 2, 35.01)
INSERT @INVENTORY VALUES ('2011-01-01', 3, 17.01)
INSERT @INVENTORY VALUES ('2011-02-01', 2, 50.01)
INSERT @INVENTORY VALUES ('2011-02-01', 3, 45.01)
INSERT @INVENTORY VALUES ('2011-03-01', 1, 10.01)
INSERT @INVENTORY VALUES ('2011-03-01', 4, 5.01)

可以使用什么查询来产生以下内容?

EFFECTIVE_DATE  TOTAL_VALUE
2011-01-01      92.03
2011-02-01      135.03
2011-03-01      110.04

挑战在于库存价值将继续进入后续日期。请注意,2011-03-01表示所有四个不同项目的最新值的总和,尽管其中只有两个具有当天的记录。

3 个答案:

答案 0 :(得分:2)

这显示每个日期的项目值:

SELECT 
   D.EFFECTIVE_DATE, 
   I.ITEM, 
   COALESCE((SELECT TOP 1 VALUE FROM @INVENTORY II WHERE (II.ITEM = I.ITEM) AND (II.EFFECTIVE_DATE <= D.EFFECTIVE_DATE) ORDER BY EFFECTIVE_DATE DESC),0) VALUE
FROM (SELECT DISTINCT EFFECTIVE_DATE FROM @INVENTORY) D
CROSS JOIN (SELECT DISTINCT ITEM FROM @INVENTORY) I

这显示摘要:

SELECT 
  EFFECTIVE_DATE,
  SUM(VALUE)
FROM
(
    SELECT 
       D.EFFECTIVE_DATE, 
       I.ITEM, 
       COALESCE((SELECT TOP 1 VALUE FROM @INVENTORY II WHERE (II.ITEM = I.ITEM) AND (II.EFFECTIVE_DATE <= D.EFFECTIVE_DATE) ORDER BY EFFECTIVE_DATE DESC),0) VALUE
    FROM (SELECT DISTINCT EFFECTIVE_DATE FROM @INVENTORY) D
    CROSS JOIN (SELECT DISTINCT ITEM FROM @INVENTORY) I
) GROUPED_VALUES
GROUP BY EFFECTIVE_DATE

答案 1 :(得分:0)

SELECT EFFECTIVE_DATE, SUM(VALUE) AS TOTAL_VALUE
FROM @INVENTORY
GROUP BY EFFECTIVE_DATE

答案 2 :(得分:0)

尝试此查询。它首先选择每个项目的最大日期,然后将其与原始表格连接以获得总值。

;WITH Items as
(
select  Item,MAX(EFFECTIVE_DATE) Med
from    @INVENTORY
group by Item
)
select  sum(Value)
from    Items a inner join
        @INVENTORY b on a.Item=b.Item and a.Med=b.EFFECTIVE_DATE