avatar
Untitled

Guest 172 11th Oct, 2024

MARKUP 6.22 KB
                                           
                         -- Tabela faktów
CREATE TABLE Fakt_Zamówienia (
    RowID INT PRIMARY KEY,
    OrderID INT,
    OrderDate DATE,
    ShipDate DATE,
    OrderPriority VARCHAR(50),
    Quantity INT,
    Sales DECIMAL(10, 2),
    Discount DECIMAL(5, 2),
    ShipMode VARCHAR(50),
    Profit DECIMAL(10, 2),
    UnitPrice DECIMAL(10, 2),
    ShippingCost DECIMAL(10, 2),
    CustomerID INT,
    ProductID INT,
    ShipDateID INT,
    FOREIGN KEY (CustomerID) REFERENCES Wymiar_Klient(CustomerID),
    FOREIGN KEY (ProductID) REFERENCES Wymiar_Produkt(ProductID),
    FOREIGN KEY (ShipDateID) REFERENCES Wymiar_Data(DataID)
);

-- Tabela wymiarów: Klient
CREATE TABLE Wymiar_Klient (
    CustomerID INT PRIMARY KEY,
    CustomerName VARCHAR(255),
    Province VARCHAR(100),
    Region VARCHAR(100),
    CustomerSegment VARCHAR(100)
);

-- Tabela wymiarów: Produkt
CREATE TABLE Wymiar_Produkt (
    ProductID INT PRIMARY KEY,
    ProductCategory VARCHAR(100),
    ProductSubCategory VARCHAR(100),
    ProductName VARCHAR(255),
    ProductContainer VARCHAR(100),
    ProductBaseMargin DECIMAL(5, 2)
);

-- Tabela wymiarów: Data
CREATE TABLE Wymiar_Data (
    DataID INT PRIMARY KEY,
    OrderDate DATE,
    Rok INT,
    Miesiąc INT,
    Dzień INT,
    Kwartał INT
);

-- Tabela wymiarów: Wysyłka
CREATE TABLE Wymiar_Wysyłka (
    ShipMode VARCHAR(50),
    ShippingCost DECIMAL(10, 2),
    ShipDateID INT PRIMARY KEY
);

Aby przenieść dane z tabeli Zamówienia do nowo utworzonych tabel faktów i wymiarów zgodnie z schematem gwiazdy, proces można podzielić na kilka etapów. Najpierw musimy wypełnić tabele wymiarów, a następnie tabelę faktów, używając kluczy obcych, które będą odnosiły się do wymiarów.

Poniżej krok po kroku pokazuję, jak można tego dokonać.

1. Wypełnianie tabel wymiarów

Najpierw przenosimy unikalne wartości do tabel wymiarów, a następnie przypisujemy identyfikatory (ID), które posłużą do powiązania z tabelą faktów.

Wymiar Klient

-- Wstaw unikalnych klientów do tabeli wymiarów
INSERT INTO Wymiar_Klient (CustomerID, CustomerName, Province, Region, CustomerSegment)
SELECT DISTINCT 
    ROW_NUMBER() OVER (ORDER BY CustomerName) AS CustomerID, -- Tworzymy nowe ID dla klienta
    CustomerName,
    Province,
    Region,
    CustomerSegment
FROM Zamówienia;

Wymiar Produkt

-- Wstaw unikalne produkty do tabeli wymiarów
INSERT INTO Wymiar_Produkt (ProductID, ProductCategory, ProductSubCategory, ProductName, ProductContainer, ProductBaseMargin)
SELECT DISTINCT 
    ROW_NUMBER() OVER (ORDER BY ProductName) AS ProductID, -- Tworzymy nowe ID dla produktu
    ProductCategory,
    ProductSubCategory,
    ProductName,
    ProductContainer,
    ProductBaseMargin
FROM Zamówienia;

Wymiar Data

Można przenieść zarówno daty zamówienia (OrderDate), jak i daty wysyłki (ShipDate) do tabeli Wymiar_Data.

-- Wstaw unikalne daty zamówień do tabeli wymiarów
INSERT INTO Wymiar_Data (DataID, OrderDate, Rok, Miesiąc, Dzień, Kwartał)
SELECT DISTINCT 
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS DataID, -- Tworzymy nowe ID dla daty
    OrderDate,
    YEAR(OrderDate) AS Rok,
    MONTH(OrderDate) AS Miesiąc,
    DAY(OrderDate) AS Dzień,
    CASE 
        WHEN MONTH(OrderDate) IN (1, 2, 3) THEN 1
        WHEN MONTH(OrderDate) IN (4, 5, 6) THEN 2
        WHEN MONTH(OrderDate) IN (7, 8, 9) THEN 3
        ELSE 4
    END AS Kwartał
FROM Zamówienia;

Wymiar Wysyłka

-- Wstaw unikalne tryby wysyłki do tabeli wymiarów
INSERT INTO Wymiar_Wysyłka (ShipMode, ShippingCost, ShipDateID)
SELECT DISTINCT 
    ShipMode,
    ShippingCost,
    ROW_NUMBER() OVER (ORDER BY ShipMode) AS ShipDateID -- Tworzymy nowe ID dla wysyłki
FROM Zamówienia;

2. Wypełnianie tabeli faktów

Po wypełnieniu tabel wymiarów możemy teraz wypełnić tabelę faktów. W tej tabeli musimy połączyć dane z tabeli Zamówienia z tabelami wymiarów, korzystając z odpowiednich identyfikatorów (ID).

-- Wstaw dane do tabeli faktów, łącząc je z tabelami wymiarów
INSERT INTO Fakt_Zamówienia (
    RowID, OrderID, OrderDate, ShipDate, OrderPriority, Quantity, Sales, Discount, ShipMode, Profit, UnitPrice, ShippingCost, CustomerID, ProductID, ShipDateID
)
SELECT
    z.RowID, 
    z.OrderID, 
    z.OrderDate, 
    z.ShipDate, 
    z.OrderPriority, 
    z.Quantity, 
    z.Sales, 
    z.Discount, 
    z.ShipMode, 
    z.Profit, 
    z.UnitPrice, 
    z.ShippingCost,

    -- Pobierz ID klienta z tabeli Wymiar_Klient
    k.CustomerID,

    -- Pobierz ID produktu z tabeli Wymiar_Produkt
    p.ProductID,

    -- Pobierz ID daty z tabeli Wymiar_Data
    d.DataID AS ShipDateID

FROM Zamówienia z

-- Łączymy z tabelą wymiarów Klient
JOIN Wymiar_Klient k ON z.CustomerName = k.CustomerName
    AND z.Province = k.Province
    AND z.Region = k.Region
    AND z.CustomerSegment = k.CustomerSegment

-- Łączymy z tabelą wymiarów Produkt
JOIN Wymiar_Produkt p ON z.ProductName = p.ProductName
    AND z.ProductCategory = p.ProductCategory
    AND z.ProductSubCategory = p.ProductSubCategory

-- Łączymy z tabelą wymiarów Data dla wysyłki
JOIN Wymiar_Data d ON z.ShipDate = d.OrderDate;

Wyjaśnienia:

	1.	Tabele wymiarów: Każda z tabel wymiarów jest wypełniana unikalnymi wartościami z oryginalnej tabeli Zamówienia. Identyfikatory (ID) są generowane za pomocą funkcji ROW_NUMBER(), aby utworzyć unikalne klucze główne.
	2.	Tabela faktów: Tabela Fakt_Zamówienia jest wypełniana danymi z tabeli Zamówienia, łącząc je z tabelami wymiarów, aby uzyskać odpowiednie klucze obce.

Po wykonaniu tych operacji wszystkie dane z oryginalnej tabeli Zamówienia powinny zostać przeniesione do tabel wymiarów i faktów zgodnie z zasadami schematu gwiazdy.
                      
                                       
To share this paste please copy this url and send to your friends
RAW Paste Data
Recent Pastes
Ta strona używa plików cookie w celu usprawnienia i ułatwienia dostępu do serwisu oraz prowadzenia danych statystycznych. Dalsze korzystanie z tej witryny oznacza akceptację tego stanu rzeczy.
Wykorzystywanie plików Cookie
Jak wyłączyć cookies?
ROZUMIEM