sql >> データベース >  >> RDS >> Mysql

SQLデータベースを正規化する方法

    スクリプトでテーブルを正規化する例を次に示します。このようなことをすることをお勧めします

    e.g Table: tbl_tmpData
    Date, ProductName, ProductCode, ProductType, MarketDescription, Units, Value
    2010-01-01, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 1', 20, 20.00
    2010-01-02, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 2', 40, 40.00
    2010-01-03, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 3', 40, 40.00
    2010-01-01, 'Cola', '02', 'Drink', 'Store 1', 40, 80.00
    2010-01-02, 'Cola', '02', 'Drink', 'Store 2', 20, 40.00
    2010-01-03, 'Cola', '02', 'Drink', 'Store 2', 60, 120.00
    2010-01-01, 'Simiri Gum', '03', 'Gum', 'Store 1', 40, 80.00
    2010-01-02, 'Simiri Gum', '03', 'Gum', 'Store 2', 20, 40.00
    2010-01-03, 'Simiri Gum', '03', 'Gum', 'Store 3', 60, 120.00
    

    最初に日付テーブルを作成します:

    CREATE TABLE tbl_Date
    (
    DateID int PRIMARY KEY IDENTITY(1,1)
     ,DateValue datetime
    )
    
    INSERT INTO tbl_Date (DateValue)
    SELECT DISTINCT Date
    FROM tbl_Data
    WHERE Date NOT IN (SELECT DISTINCT DateValue FROM tbl_Date)
    

    次に、マーケットテーブルを作成します

    CREATE TABLE tbl_Market
    (
    MarketID int PRIMARY KEY IDENTITY(1,1)
     ,MarketName varchar(200)
    )
    
    INSERT INTO tbl_Market (MarketName)
    SELECT DISTINCT MarketDescription
    FROM tbl_tmpData
    WHERE MarketName NOT IN (SELECT DISTINCT MarketDescription FROM tbl_Market)
    

    次に、ProductTypeテーブルを作成します

    CREATE TABLE tbl_ProductType
    (
    ProductTypeID int PRIMARY KEY IDENTITY(1,1)
     ,ProductType varchar(200)
    )
    
    INSERT INTO tbl_ProductType (ProductType)
    SELECT DISTINCT ProductType
    FROM tbl_tmpData
    WHERE ProductType NOT IN (SELECT DISTINCT ProductType FROM tbl_ProductType)
    

    次に、製品テーブルを作成します

    CREATE TABLE tbl_Product
    (
    ProductID int PRIMARY KEY IDENTITY(1,1)
    , ProductCode varchar(100)
    , ProductDescription varchar(300)
     ,ProductType int
    )
    
    INSERT INTO tbl_Product (ProductCode, ProductDescription, ProductType)
    SELECT DISTINCT tmp.ProductCode,tmp.ProductName, pt.ProductType
    FROM tbl_tmpData tmp
    INNER JOIN tbl_ProductType pt ON tmp.ProductType = pt.ProductType
    WHERE ProductCode NOT IN (SELECT DISTINCT ProductCode FROM tbl_Product)
    

    次に、データテーブルを作成します

    CREATE TABLE tbl_Data
    (
    DataID int PRIMARY KEY IDENTITY(1,1)
    , DateID varchar(100)
    , ProductID varchar(100)
    , MarketID varchar(300)
     ,Units decimal(10,5)
     , value decimal(10,5)
    )
    
    
    INSERT INTO tbl_Data (ProductID, MarketID, Units, Value)
    SELECT t.DateID
           , p.ProductID
           , m.MarketID
           , SUM(tmp.Units)
           , SUM(tmp.VALUE)
    FROM tbl_tmpData tmp
    INNER JOIN tbl_Date t ON tmp.Date = t.DateValue
    INNER JOIN tbl_Product p ON tmp.ProductCode = p.ProductCode
    INNER JOIN tbl_Market m ON tmp.MarketDescription = m.MarketName 
    GROUP BY t.DateID, p.ProductID, m.MarketID
    ORDER BY t.DateID, p.ProductID, m.MarketID
    


    1. MySQLデータベースに写真を保存する方法

    2. Oracleのテーブルでのシーケンスギャップの検索

    3. SQL Serverの変更データキャプチャ(CDC)テーブルから履歴または監査ビューを作成する方法-SQLServerチュートリアル

    4. エラー1045(28000)を克服する方法:ユーザー'ODBC' @'localhost'(パスワードを使用:NO)のアクセスが永続的に拒否されました