посмотреть, чтобы выбрать определенный период или последний, когда ноль - PullRequest
1 голос
/ 12 апреля 2010

У меня есть таблица продуктов, которая упрощается до этого:

create table product(id int primary key identity, productid int, year int, quarter int, price money)

и некоторые образцы данных:

insert into product select 11, 2010, 1, 1.11
insert into product select 11, 2010, 2, 2.11
insert into product select 11, 2010, 3, 3.11
insert into product select 12, 2010, 1, 1.12
insert into product select 12, 2010, 2, 2.12
insert into product select 13, 2010, 1, 1.13

Цены могут быть изменены каждый квартал, но не все продукты получают новую цену каждый квартал. Теперь я могу дублировать данные каждый квартал, сохраняя цену одинаковой, но я предпочитаю использовать представление.

Как создать представление, которое можно использовать для возврата цен (например, за 2 квартал)? Я написал это, чтобы вернуть текущую (= последнюю) цену:

CREATE VIEW vwCurrentPrices AS
    SELECT *
    FROM
    (
      SELECT  *, ROW_NUMBER() OVER (PARTITION BY productid  ORDER BY year DESC, quarter DESC) AS Ranking        
      FROM product
    ) p
    WHERE p.Ranking = 1

Я хотел бы создать представление, чтобы я мог использовать такие запросы, как select * from vwProduct where quarter = 2

Ответы [ 2 ]

1 голос
/ 13 апреля 2010
CREATE TABLE quarters ([year] int, [quarter] int, PRIMARY KEY([year],[quarter]))

INSERT INTO quarters ([year], [quarter])
SELECT 2000 + number/4 [year], number%4 + 1 [quarter]
FROM master.dbo.spt_values
WHERE type = 'P' AND number BETWEEN 0 and 199

CREATE VIEW pricing WITH SCHEMABINDING AS 
WITH pricerank AS
    (SELECT q.[year], q.[quarter], p.productid, p.price, 
    p.[year] effectiveyear, p.[quarter] effectivequarter, 
    ROW_NUMBER() OVER (PARTITION BY p.productid, 
    q.[year], q.[quarter] ORDER BY p.[year] DESC, p.[quarter] DESC) AS ranking 
    FROM dbo.quarters q INNER JOIN dbo.product p
    ON p.[year] = q.[year] AND p.[quarter] <= q.[quarter] OR p.[year] < q.[year]
    WHERE q.[year] <= YEAR(GETDATE()))
SELECT [year], [quarter], productid, price
FROM pricerank
WHERE ranking = 1

CREATE UNIQUE CLUSTERED INDEX IX_pricing ON pricing([year],[quarter],productid)
0 голосов
/ 12 апреля 2010

После некоторых экспериментов я придумал UDF, который достиг желаемого результата. Сначала он фильтрует все цены до желаемой даты (квартал + год), затем принимает наибольшее количество строк, то есть последний результат.

CREATE FUNCTION dbo.fTest(@year int, @quarter int)
RETURNS TABLE 
AS

return
(
    select * from
    (
        SELECT  *, 
        ROW_NUMBER() OVER (PARTITION BY productid  ORDER BY year DESC, quarter DESC ) AS rownum
        FROM product
        where DateAdd(month, (quarter - 1) * 3, DateAdd(Year, year - 1900, 0)) <= DateAdd(month, (@quarter - 1) * 3, DateAdd(Year, @year - 1900, 0))
    ) p
    where rownum = 1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...