1

次のソース テーブルが与えられます。

 CREATE TABLE prices
(
   Style     CHAR(10),
   Size      CHAR(10),
   BeginDate DATE,
   EndDate   DATE,
   price     DECIMAL(18, 2)
)

INSERT INTO prices
            (Style,
             Size,
             BeginDate,
             EndDate,
             price)
VALUES      ('B100',NULL,'1-10-2010','1-30-2010',-5),
            ('B101',NULL,'1-10-2010','1-15-2010',-10),
            ('B102',NULL,'1-10-2010','1-15-2010',-20),
            ('B100','32x32','1-10-2010','1-15-2010',-1),
            ('B100','32x34','1-11-2010','1-20-2010',-2),
            ('B100','32x36','1-01-2010','1-15-2010',-3),
            ('B100','32x38','1-10-2010','2-15-2010',-4)

CREATE TABLE Products
(
   ProductKey INT,
   Style      CHAR(10),
   Size       CHAR(10)
)

INSERT INTO Products
            (ProductKey,
             Style,
             Size)
VALUES      (1,'B100','32x32'),
            (2,'B100','32x34'),
            (3,'B100','32x36'),
            (4,'B100','32x38'),
            (5,'B100','32x40'),
            (6,'B101','32x32'),
            (7,'B101','32x34'),
            (8,'B101','32x36'),
            (9,'B101','32x38'),
            (10,'B101','32x40'),
            (11,'B102','32x32'),
            (12,'B103','32x34'),
            (13,'B103','32x36'),
            (14,'B103','32x38'),
            (15,'B103','32x40') 

次の出力を生成する必要があります

ProductKey  BeginDate   EndDate     Price
1           1-10-2010   1-15-2010   -1
1           1-16-2010   1-30-2010   -5
2           1-10-2010   1-10-2010   -5
2           1-11-2010   1-20-2010   -2
2           1-21-2010   1-30-2010   -5
etc....

したがって、価格表は割引の SCD です。割引は、スタイル レベルまたは個々のサイズ レベルで適用できます。

サイズ レベルの割引は、特定の期間のスタイル レベルの割引よりも優先されます。とにかく、期間はほとんど重複する可能性があります。

この質問は、私が 1 年前に尋ねた質問と似ています。 カーソルやwhileループに頼らずにこれを行う方法に頭を悩ませようとしている大きな問題があります。

助けてくれてありがとう。

4

1 に答える 1

0

SQL フィドル

WITH cte AS (
SELECT p.*,s1.BeginDate, s1.EndDate, s1.price
FROM Products p
INNER JOIN prices s1
 ON p.Style = s1.Style
 AND p.Size = s1. Size
)
SELECT *
FROM cte
UNION ALL
SELECT
  c.PRODUCTKEY, c.STYLE, c.SIZE
  , DATEADD(day,1,c.EndDate)
  , s.EndDate
  , s.Price
FROM cte c
INNER JOIN prices s
 ON c.Style = s.Style
 AND s.Size IS NULL
 AND c.EndDate > s.BeginDate AND c.EndDate < s.EndDate
UNION ALL
SELECT
  c.PRODUCTKEY, c.STYLE, c.SIZE
  , s.BeginDate
  , DATEADD(day,-1,c.BeginDate)
  , s.Price
FROM cte c
INNER JOIN prices s
 ON c.Style = s.Style
 AND s.Size IS NULL
 AND c.BeginDate > s.BeginDate AND c.BeginDate < s.EndDate
ORDER BY ProductKey,BeginDate
于 2013-07-29T15:46:05.810 に答える