SQL - 从两个表中SUM两列并写入新列

时间:2017-10-11 07:58:42

标签: sql sql-server tsql sql-server-2005

我有以下情况要解决。我有一个包含产品信息的表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




3 个答案:

答案 0 :(得分:1)

在传统的关系数据库中,它都是关于规范化的。换句话说,你应该只有一个权威来源。通过创建新列,您将拥有多个“正确数据”源。例如,如果频率增加,并且您的代码忘记更新列,那么谁说现在哪个值正确?

建议,让RDBMS执行work for you with a 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的目的:

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 ...

答案 1 :(得分:0)

如果您不想/不能重新设计表格,可以尝试一下:

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的答案!!!!!! (我在评论中也提到了这一点)

答案 2 :(得分:0)

您可以尝试

<script>
    function submitForm(id){
        if (id === 1)
            document.getElementById("myForm").target = "URL1";
        else
            document.getElementById("myForm").target = "URL2";

        document.getElementById("myForm").submit();
    }
</script>

计算Sum_ProductA和Sum_ProductB的列。

然而,它假设产品是表A的关键