簡體   English   中英

SQL-將兩個表中的兩個列相加並寫入新列

[英]SQL - SUM two columns from two tables and write in new Column

我有以下情況要解決。 我有一個帶有產品信息的表A,還有一個帶有客戶購買歷史的表B。 現在我需要在一個新的欄目“來計算Sum_product_X ”對每個產品的價值購買的頻率之和ClientID 因此,在這種情況下,我們知道一個客戶購買了Product A 5次,因此我們需要在sum_producta列中計算5 * 5$的總和

  Table A (Product Price Table)
    ----------------------------
    ProductA | ProductB | ProductC

    5$ | 10$ | 15$         



    Table B (Client purchase history)
    -----------------------
    ClientID | Frequency_ProductA |Frequency_ProductB | Sum_ProductA | Sum_ProductB

    Abc123 | 5 | 10 | to be calculated: 5*5 | to be calculated 10*10

我需要補充的是,我發現對環境的SQL支持具有以下規則:

帳戶或父帳戶中僅數據擴展或數據視圖的SELECT語句嵌套查詢UNION JOIN GROUP BY

表A可以修改。 意味着結構可能如下所示:

 Table A ----------------------- Productname | Price product A | 5 product B | 10 product C | 15 

在傳統的關系數據庫中,一切都與規范化有關。 換句話說,您應該擁有完全唯一的權威來源。 通過創建新列,您將擁有“正確數據”的多個來源。 例如,如果頻率增加,而您的代碼卻忘記了更新列,那誰說現在是正確的值?

建議,讓RDBMS 使用VIEW為您完成工作 您需要更好地規范您當前的架構,以利用此優勢。 我會在下面解決。

CREATE VIEW product_sales AS
  SELECT
   tabA.product_name,
   tabA.product_price,
   tabB.clientID,
   tabC.frequency,
   tabA.product_price * tabC.count AS sum_product_x
  FROM
    tableA AS tabA,
    tableB AS tabB,
    tableC AS tabC
  WHERE
      tabA.product_id = tabC.product_id
  AND tabB.clientID = tabC.client_id;

現在,在查詢中,出於選擇目的,您將VIEW視為另一個表:

SELECT * FROM product_sales ORDER BY 5 DESC, 1 ASC LIMIT 5;

不幸的是,您當前的設計似乎每個產品都有一列。 通常這是不可以的。 您要為每個新產品添加一列嗎? 我當然希望不會。 而是將數據標准化到單獨的表中,並使用主鍵和外鍵鏈接:

CREATE TABLE products (
  product_id     CHAR(5)     PRIMARY KEY,
  product_name   VARCHAR(32) NOT NULL,
  product_price  INTEGER     NOT NULL
);

CREATE TABLE clients (
 client_id      VARCHAR(8) PRIMARY KEY,
 client_name    VARCHAR(32) NOT NULL,
);

CREATE TABLE client_purchaces (
 client_id     VARCHAR(8) NOT NULL,
 product_id    CHAR(5)    NOT NULL,
 count         INTEGER    NOT NULL,

 FOREIGN KEY (client_id) REFERENCES clients(client_id),
 FOREIGN KEY (client_id) REFERENCES products(product_id),
 CONSTRAINT CHECK (count >= 0)
);

通過這種結構,當有新產品出現時,您只需添加一行( INSERT INTO products ... ),而不用更改架構( ALTER TABLE ... )。 此外,當客戶進行購買時,您只需插入或更新單個整數,而不用覆蓋行或更改架構。 此外,使用像這樣的更規范的設計,您可以讓數據庫為您完成工作(例如CREATE VIEW ...

如果您不想/不能重新設計表,可以嘗試一下:

UPDATE table_b
SET SUM_ProductA = (Frequency_Product_A * (SELECT ProductA FROM table_a)),
    SUM_ProductB = (Frequency_Product_B * (SELECT ProductB FROM table_a)),
    SUM_ProductC = (Frequency_Product_C * (SELECT ProductC FROM table_a))

否則,我真的推薦@hunteke的答案! (我在評論中也提到了這一點)

你可以試試

UPDATE tableB 
SET sum_productA = (SELECT Price * Frequency_ProductA FROM tableA WHERE Product = 'ProductA'),
SET sum_productB = (SELECT Price * Frequency_ProductB FROM tableA WHERE Product = 'ProductB');

計算列Sum_ProductA和Sum_ProductB。

但是,它假定Product是表A的鍵

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM