Query to represent total value for significant dates
Given a table with the value of individual items in inventory for particular dates, how can I return summary data that reflects the total value at each unique date?
For example, given the following structure:
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 VAL开发者_如何学PythonUES ('2011-03-01', 4, 5.01)
What query can be used to result in the following?
EFFECTIVE_DATE TOTAL_VALUE
2011-01-01 92.03
2011-02-01 135.03
2011-03-01 110.04
The challenge is that the inventory value would continue to be carried into subsequent dates. Notice that 2011-03-01 represents the sum of the most recent value for all four different items though only two of them have a record for that day.
This shows value for items in every date:
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
This shows summary:
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
SELECT EFFECTIVE_DATE, SUM(VALUE) AS TOTAL_VALUE
FROM @INVENTORY
GROUP BY EFFECTIVE_DATE
Try this query. It first select the max date for each Item and then join it with the original table to obtain the total Value.
;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
精彩评论