【问题标题】:SQL Query Sum, Multiply and combine 5 tables then groupSQL查询总和,乘以并组合5个表然后分组
【发布时间】:2019-03-03 03:26:09
【问题描述】:

我已经创建了我的表。我正在尝试创建一个查询,该查询将已售表中的sold_quantity 和on_sale 表中的sale_price 相乘并相加,现在将其称为R1,将产品表中的retail_price 和已售表中的sold_quantity 称为R2。
在我的查询中,我想计算我的收入。问题是有两个不同的日期,但有一个销售数量。这意味着我很难区分两种类型的销售(折扣销售、零售)。
例如,2月1日,我有一个促销活动,我卖出了10个数量,卖出的价格为sale_price,日期保存为sale_date,参考On_sale表。 2 月 2 日,我卖出了 8 个数量,但卖出的价格保存为 Retail_price,保存为 sold_date。

CREATE TABLE Sold (
  store_number int(16)  NOT NULL AUTO_INCREMENT,
  pid int(16) NOT NULL,
  sold_date date NOT NULL,
  sold_quantity int(16) NOT NULL,
  PRIMARY KEY (pid,store_number,sold_date)
);


 CREATE TABLE Store (
  store_number int(16)  NOT NULL AUTO_INCREMENT,
  phone_number varchar(16)  NOT NULL DEFAULT '0',
  street_address varchar(250) NOT NULL,
  city_name varchar(250) NOT NULL,
  state varchar(250) NOT NULL,
  PRIMARY KEY (store_number)
);
CREATE TABLE On_sale (
  pid int(16) NOT NULL,
  sale_date date NOT NULL,
  sale_price float(16) NOT NULL,
  PRIMARY KEY (pid,sale_date)
);

CREATE TABLE Product (
  pid int(16) NOT NULL,
  product_name varchar(250) NOT NULL,
  retail_price float(16) NOT NULL,
  manufacture_name varchar(250) NOT NULL,
  PRIMARY KEY (pid)
);
CREATE TABLE City (
  city_name varchar(250) NOT NULL,
  state varchar(250) NOT NULL,
  population int(16) NOT NULL DEFAULT '0',
  PRIMARY KEY (city_name,state)
);


这就是我想要的 样本数据

STORE TABLES
store_number  phone_number  street_address city_name state 
     1           #             ###          New York    NY
     2           #             ###          HOUSTON     TX
     3           #             ###          L.A         CA


Sold Tables
store_number  PID  SOLD DATE  SOLD_QUANTITY  
     1         1      2/2/2017    3
     2         2      2/3/2018    3
     3         3      2/5/2019    4

On_sale Tables
PID  SALE_DATE    SALE PRICE  
1      2/4/2018    2

Product Tables
PID  PRODUCT NAME  RETAIL_PRICE manufacture_name
1       XX           5              XXX          
2      XX          4             XXX       
3       XX           3              XXX       


CITY TABLE

CITY_NAME  STATE    POPULATION  
New York   NY    100
HOUSTON    TX    200
L.A        CA    201

RESULT 

YEAR  REVENUE POPULATION
2017   15       (NEW YORK)SMALL 
2018   14        (HOUSTON)MEDIUM
2019   12       (L.A) LARGE

我的数据说明
: 这非常令人困惑。首先我需要根据销售日期和销售日期显示年份,然后计算收入。例如,在 2018 年,revneue 为 (2 from on_sale table's sale_price) + (12 (3 * 4, 3 is the sold_quantity from sold_table, and 4 is retail_price) = 14.
城市大小由范围分隔,其中 0>#=x 这需要我在查询得到 R1(正常价格)和 R2(特价)后加入城市表。这就是我得到的。我很迷茫

SELECT Sold.sold_quantity,
       Product.retail_price AS S1
    SUM(Product.retail_price*Sold.sold_quantity) AS R1

FROM  Sold LEFT JOIN Product
ON     Sold.pid=Product.pid

SELECT Sold.sold_quantity,
       On_sale.sale_price AS S2
    SUM(On_sale.sale_price) AS R2

FROM  Sold LEFT JOIN On_sale
ON     Sold.pid=On_sale.pid

【问题讨论】:

  • 您仍然缺少示例数据...但是请查看@fa06 的答案,这可能是您需要的。
  • 嘿@YeLuWang...你为什么要删除你的other question?我正要发布一个我认为响应了您的用例的答案...
  • 哦,对不起,我再打开它!我很想看到一个替代解决方案!非常感谢!
  • @GMB 你好!问题在这里:stackoverflow.com/q/54975725/11142226非常感谢您的帮助!

标签: mysql sql


【解决方案1】:

你可以试试下面-

SELECT year(sold_date) as yr,population
,SUM(Product.retail_price*Sold.sold_quantity) -SUM(On_sale.sale_price * Sold.sold_quantity) AS revenue
FROM  Sold 
LEFT JOIN Product ON  Sold.pid=Product.pid
LEFT JOIN On_sale ON Sold.pid=On_sale.pid
left join city on city.city_name=product.manufacture_name 
group by year(sold_date),population

【讨论】:

    【解决方案2】:

    我不明白您在查询中使用了LEFT JOIN。您似乎有一个定义明确的数据模型,并且 id 应该对齐。

    您明确表示要添加 R1R2,因此您描述的查询如下所示:

    SELECT year(s.sold_date) as yr, c.population,
           (SUM(p.retail_price * s.sold_quantity) +
            SUM(os.sale_price * s.sold_quantity)
           ) AS revenue
    FROM  Sold s JOIN
          Product p
          ON s.pid = p.pid JOIN
          city c
          ON c.city_name = p.manufacture_name LEFT JOIN
          On_sale os
          ON s.pid = os.pid AND
             os.sale_date = s.sold_date
    GROUP BY year(s.sold_date), c.population
    ORDER BY year(s.sold_date), c.population;
    

    请注意,这会添加一个额外条件,说明日期与 on_sale 表匹配。这对我来说很有意义。

    添加这两个收入数字对我来说似乎很可疑。我希望您需要销售价格(如果存在),否则需要零售价格。如果是这样,那么计算将是:

           SUM(COALESCE(os.sale_price, p.retail_price) * s.sold_quantity) AS revenue
    

    如果您想要折扣金额的总和,那么差异是有意义的。

    【讨论】:

    • 您好,先生,快速提问。如果我想根据数字范围对人口进行分组。假设当人口在 0 到 100 之间时,我称之为小,>= 100 和
    • @YeLuWang 。 . .是的,您将使用case 表达式。如果你不明白,问另一个问题。这个问题显然不是关于分箱人口。
    • 谢谢!我刚刚问了另一个问题,感谢您的帮助!请查看我的问题stackoverflow.com/questions/54974796/…
    • @Grdon Linoff 谢谢!我想我已经解决了,感谢您的帮助!
    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 2011-04-08
    • 2022-08-08
    • 2020-04-06
    • 1970-01-01
    • 2012-10-07
    • 2015-11-26
    • 2022-01-12
    相关资源
    最近更新 更多