mysql-使用5个表生成查询

mysql-使用5个表生成查询,第1张

概述我已经创建了表格.我正在尝试创建一个查询,该查询将已售表中的sold_quantity乘以on_sale表中的sale_price并相加,现在称为R1,而产品表中的Retail_price和已售表中的sold_quantity称为R2.在查询中,我要计算我的收入.收获是有两个不同的日期,但有一个销售数量.这意味着我很难区分两种销售类型(折扣销售,零售销售).

我已经创建了表格.我正在尝试创建一个查询,该查询将已售表中的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,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,population int(16) NOT NulL DEFAulT '0',PRIMARY KEY (city_name,state));

这就是我要的:

样本数据:

店铺表:

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

出售表:

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

特价表:

PID  SALE_DATE    SALE PRICE  1      2/4/2018    2

产品表:

PID  PRODUCT name  RETAIL_PRICE manufacture_name1       XX           5              XXX          2      XX          4             XXX       3       XX           3              XXX       

城市表:

CITY_name  STATE    POPulATION  New York   NY    100HOUSTON    TX    200L.A        CA    201

扩展结果:

YEAR  REVENUE   POPulATION2017   15       (NEW YORK)SMALL 2018   14       (HOUSTON)MEDIUM2019   12       (L.A) LARGE

我的数据说明

这非常令人困惑.首先,我需要根据销售日期和销售日期显示年份,然后计算收入.例如,在2018年,收入是(on_sale表的sale_price中的2)(12(3 * 4,3是sold_table中的sold_quantity,4是retail_price)= 14.

城市大小由范围分隔,其中0≤100较小100 = x≤200中等,大于200的任何事物都较大.括号中的城市名称仅用于帮助跟踪.城市基于商店表中的城市名称和州,通过比较已售表和商店表上的store_number来确定城市

这要求我在查询后加入城市表以获取R1(正常价格)和R2(销售价格).这就是我得到的.我很迷路:

   SELECT year(s.sold_date) as yr,c.population,SUM(COALESCE(os.sale_price,p.retail_price) * s.sold_quantity) AS revenue,CASE    WHEN population >= 0 AND population < 3700000 THEN 'small'    WHEN population >= 3700000 AND population < 6700000 THEN 'medium'    WHEN population >= 6700000 AND population < 9000000 THEN 'large'    WHEN population >= 9000000 THEN 'extra_large'    ELSE '-1' END AS citycategoryFROM Sold s JOIN      Product p      ON s.pID = p.pID JOIN      Store st      ON st.store_number = s.store_number left JOIN      On_sale os      ON s.pID = os.pID JOIN      city c      ON c.city_name = st.city_nameGROUP BY year(s.sold_date),c.populationORDER BY year(s.sold_date) ASC,c.population;
最佳答案这是一种可以完成工作的方法.逻辑是使用聚合子查询进行中间计算.

该查询按年份从On_sale表中获取收入.

SELECT     YEAR(sale_date) yr,SUM(sale_price) amtFROM     On_saleGROUP BY     YEAR(sale_date);

此其他查询使用“已售出”和“产品”表获取每家商店和每年的收入:

SELECT     s.store_number,YEAR(s.sold_date) yr,SUM(s.sold_quantity * p.retail_price) amtFROM     Sold s    INNER JOIN Product p         ON p.pID = s.pIDGROUP BY     s.store_number,YEAR(sold_date);

现在,我们可以使用“城市”和“商店”表联接这些查询的结果.同时,我们可以将城市划分为不同的大小类别,并使用它们来汇总结果.我正在使用left JOIN,以防子查询之一产生空结果集(否则,INNER JOIN可以):

SELECT     COALESCE(sa.yr,so.yr) sale_year,CASE         WHEN c.population > 200 THEN 'large'        WHEN c.population <= 200 AND c.population > 100 THEN 'medium'        ELSE 'small'    END as size_range,SUM(COALESCE(so.amt,0) + COALESCE(sa.amt,0)) revenueFROM     City c    INNER JOIN Store st         ON  st.state = c.state         AND st.city_name = c.city_name    left JOIN (        SELECT             s.store_number,SUM(s.sold_quantity * p.retail_price) amt        FROM             Sold s            INNER JOIN Product p                 ON p.pID = s.pID        GROUP BY             s.store_number,YEAR(sold_date)    ) so         ON  so.store_number = st.store_number    left JOIN (        SELECT             YEAR(sale_date) yr,SUM(sale_price) amt        FROM             On_sale        GROUP BY             YEAR(sale_date)    ) sa         ON  sa.yr = so.yrGROUP BY    sale_year,size_rangeORDER BY    sale_year,size_range

带有示例数据的demo on DB Fiddle演示了中间步骤,最后返回:

| sale_year | size_range | revenue || --------- | ---------- | ------- || 2017      | small      | 15      || 2018      | medium     | 14      || 2019      | large      | 12      |
总结

以上是内存溢出为你收集整理的mysql-使用5个表生成查询 全部内容,希望文章能够帮你解决mysql-使用5个表生成查询 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1166009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存