[英]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.