使用 5 个表生成查询

2023-12-29

我已经创建了我的表。我正在尝试创建一个查询,将已售表中的 sell_quantity 和 on_sale 表中的 sale_price 相乘并相加,暂时将其称为 R1,将产品表中的 Retail_price 和已售表中的 sell_quantity 暂时称为 R2。

在我的查询中,我想计算我的收入。问题是有两个不同的日期,但有一个销售数量。这意味着我很难区分两种类型的销售(折扣销售、零售销售)。

例如,2月1日,我正在进行促销,我售出了10个数量,售出价格为sale_price,日期保存为sale_date,请参阅On_sale表。 2 月 2 日,我售出 8 件,但售出价格保存为 Retail_price 并保存为 sell_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 table:

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

Sold Table:

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 Table:

PID  SALE_DATE    SALE PRICE  
1      2/4/2018    2

Product Table:

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

预期结果:

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

我的数据的解释

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

城市大小按范围分隔,其中 0>#=x

这需要我在查询后加入城市表以获得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 cityCategory
FROM 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_name
GROUP BY year(s.sold_date), c.population
ORDER BY year(s.sold_date) ASC, c.population;

这是一种可以完成工作的方法。逻辑是使用聚合子查询来进行中间计算。

该查询获取的收入来自On_sale按年份列出的表格。

SELECT 
    YEAR(sale_date) yr, 
    SUM(sale_price) amt
FROM 
    On_sale
GROUP BY 
    YEAR(sale_date);

这个另一个查询使用表获取每个商店和每年的收入Sold and Product:

SELECT 
    s.store_number, 
    YEAR(s.sold_date) yr, 
    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);

现在我们可以JOIN这些查询的结果City and Store表。同时,我们可以将城市分为不同规模的类别,并用它来汇总结果。我在用LEFT JOIN万一子查询之一产生空结果集(否则,INNER JOIN is ok):

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)) revenue
FROM 
    City c
    INNER JOIN Store st 
        ON  st.state = c.state 
        AND st.city_name = c.city_name
    LEFT JOIN (
        SELECT 
            s.store_number, 
            YEAR(s.sold_date) yr, 
            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.yr
GROUP BY
    sale_year,
    size_range
ORDER BY
    sale_year,
    size_range

This DB Fiddle 上的演示 https://www.db-fiddle.com/f/g6MPFw8MQA4zfgo8bZoW8P/1用您的示例数据演示了中间步骤,最后返回:

| sale_year | size_range | revenue |
| --------- | ---------- | ------- |
| 2017      | small      | 15      |
| 2018      | medium     | 14      |
| 2019      | large      | 12      |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 5 个表生成查询 的相关文章

  • 如何比较 Postgresql 中日期时间字段中的日期?

    在比较 postgresql Windows 中的版本 9 2 4 中的日期时 我遇到了一个奇怪的情况 我的表中有一列说update date与类型timestamp without timezone 客户可以仅使用日期搜索此字段 例如 2
  • 如何使用 Alter Table 在 Access 中创建小数字段?

    我想以编程方式在 MS Access 表中创建一个新列 我尝试过很多排列ALTER TABLE MyTable Add MyField DECIMAL 9 4 NULL 并得到 字段定义中的语法错误 我可以轻松创建一个数字字段Double类
  • 随机排列每行的列值

    我正在使用 C NET 开发多项选择题考试生成器 每次做出报告时 都会在数据库中随机挑选问题 并随机调整选项 我可以做随机问题部分 但我不能做选择的洗牌 我有一张表 其中一行如下 question answer distractor1 di
  • 将sql查询结果写入mysql中的文件

    我正在尝试使用 mysql 将查询结果写入文件 我在一些地方看到了有关 outfile 构造的一些信息 但似乎这只将文件写入正在运行 MySQL 的机器 在本例中是远程机器 即数据库不在我的本地机器上 或者 我还尝试运行查询并从 mysql
  • mysql 中 INSERT 语句的计算列

    假设我想要一个表来记录其他表中的日期和列数 或者任何类型的数学 字符串连接等 CREATE TABLE log id INTEGER NOT NULL AUTO INCREMENT date DATETIME NOT NULL count
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所
  • 如何从连接字符串中提取数据库名称,而不考虑 RDBMS?

    我正在研究一个不知道正在使用的 RDBMS 的课程 当然 应用程序的其余部分都清楚这一点 连接字符串是此类的输入 我需要数据库名称 无论 RDBMS 如何 如何从连接字符串中提取数据库名称 我读到以下问题 如何使用 SqlConnectio
  • 通过 PDO 将双精度数插入 MySQL 时精度损失

    我遇到了这种非常烦人的行为 我想知道我是否做错了什么 或者这是否是故意的 如果是的话 为什么 每当我在 php 5 3 中有一个 double 类型的变量 并且想将其插入到数据库 MYSQL 5 0 的 double 类型字段中时 该值总是
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • Python 子进程、mysqldump 和管道

    我在尝试构建简单的备份 升级数据库脚本时遇到问题 错误出现在使用子进程的 mysqldump 调用中 cmdL mysqldump user db user password db pass domaindb gzip gt databas
  • SQL Like 带有子查询

    我怎样才能做到这一点 SELECT FROM item WHERE item name LIKE SELECT equipment type FROM equipment type GROUP BY equipment type 内部子查询
  • 将我的 Laravel 连接到外部数据库

    如何将 Laravel 连接到外部数据库 示例 我的本地计算机上有一个 Laravel 它在 xampp 上运行 我希望它连接到云服务器数据库 打开 env文件并编辑它 只需设置正确的外部数据库凭据 DB CONNECTION mysql
  • Chart.js - 使用 mysql 和 php 从数据库获取数据

    我正在尝试将静态数据转换为使用数据库结果 我将使用MySQL and PHP 示例代码 var randomScalingFactor function return Math round Math random 100 var lineC
  • 选择两列中两个日期之间的记录

    如何选择两列中两个日期之间的记录 Select From MyTable Where 2009 09 25 is between ColumnDateFrom to ColumnDateTo 我有一个日期 2009 09 25 我喜欢选择
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 从 $i 获取值,顺序被打乱

    for i 0 i lt count name i some output ommited td td
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中

随机推荐

  • 如何将 Syntastic 设置为 python3 检查器而不是 python2

    在 MacVim 中 我将以下代码保存为 test py print Hello world python2 这对于 python3 来说显然是错误的 但是 我运行 w 保存文件后 没有错误消息 以下是 vimrc 的一部分 都是关于 Sy
  • 如何在 Xamarin.android 中更改输入光标颜色

    在我的应用程序中需要更改 xamarin android 条目默认颜色 在我的应用程序中 背景图像是黑色 xamarin android 中条目的默认颜色也是相同的颜色 因此需要设置不同的颜色 请就此提出任何想法 我正在尝试以下代码 但没有
  • 在 Azure 自动化 Runbook 中执行时 Set-AzureRmContext 错误

    Update 似乎其他人也遇到了同样的问题reported https feedback azure com forums 246290 automation suggestions 16304161 add azurermaccount
  • 如何将 .sql 文件加载到 Scala?

    我有一个很长的 SQL 查询存储在 data sql 文件中 我想在我的 Scala 代码中执行这个文件 对于 sqlQuery 字符串 我使用 Spark sql sqlQuery 来执行 sql 但是对于 sql 文件 我应该如何执行它
  • 如何制作倒置的边框半径(反应本机)?

    我怎样才能在react native中做出这样的形状 在CSS中 解决方案之一是使用 webkit mask image 但我不知道如何在react native中做到这一点 倒边界半径 https i stack imgur com Yj
  • Realm Cocoa:通过 PK 查找多个对象

    潜伏已久 第一次提问 我在一个项目中使用 Realm Cocoa 来自 Realm io 并且正在努力通过 PK 执行搜索 假设我有一个名为RLMFoo它有一个主键称为bar 我还有一个 PK 列表 假设存储在一个数组中 NSArray p
  • 面试题:在php中,是123==0123吗?

    我已经回答了 这是假的 然后他问为什么 我无法回答 有人能回答吗 我很有兴趣学习它 这段代码 var dump 123 var dump 0123 会给你 int 123 int 83 这是因为0123是八进制表示法 因为0在开始时 whi
  • Erlang 和 JavaScript MD5 摘要匹配

    在这里测试 MD5 的 Javascript 实现 http www webtoolkit info javascript md5 htmlhttp www webtoolkit info javascript md5 html http
  • 分布式深度优先搜索

    我尝试在 C 中实现深度优先搜索 但我不太确定如何以分布式计算方式执行此操作 如果你们能帮我解决这个问题 我将非常感激 你可以在下面找到我的 DFS 代码 public class DFS static List
  • 在react-router :id中使用百分号(%)

    我正在尝试在react router id 中使用百分号 当使用 在 URI 中被禁止 我必须手动编码我的 URI 才能使用这个百分号 因此 使用 Link 时 我使用encodeURI 函数对 URI 进行编码 在我的页面的源代码中 我可
  • onLongPress 未按预期工作

    我有一个表面视图 使用以下代码在其上实现手势检测 surfaceview setOnTouchListener new OnSwipeTouchListener this public class OnSwipeTouchListener
  • 如果 div 为空,则忽略边距

    我有 2 个 DIV 彼此相邻水平对齐 并使用包装器居中 我使用 margin right 将 DIV2 与 DIV1 分开 DIV2 可能没有内容 如果 DIV2 没有内容 我希望忽略边距 而 DIV1 单独居中 这是我的CSS div1
  • 无法找到“org.springframework.mail.javamail.JavaMailSender”类型的 bean

    我在用spring boot 2 0 7 Release and spring boot starter mail 2 0 7 Release 我正在自动装配javaMailsender在尝试部署时 在 Windows 上工作正常的类内部U
  • 如何在 C#.NET 4.0 中编写 WMI 提供程序?

    任何人都可以帮助我使用 C net 4 0 编写电池的 WMI 提供程序吗 有一个旧的 C 示例here http www c sharpcorner com uploadfile falkor wmiproviderguide112620
  • Python 用户定义的数据类型

    我正在用 Python 编写一个 Rogue like 游戏 并定义我的Tile班级 瓷砖可以是块状的 墙壁的或地板的 我希望能够写一些类似的东西 self state Blocked 类似于如何使用布尔值 但具有三个值 有没有一种好方法可
  • 更改 Android 录音默认输入源

    我目前正在编写一个需要录制和实时处理音频数据的应用程序 为此 我使用 AudioRecord 类 这一切都很好 除了我的主要测试设备 Galaxy Nexus 上录制音频的默认设置是从后置扬声器录制 我假设大多数手机的默认录音源是背面或底部
  • GHC 中自动专业化的传递性

    From the docs http www haskell org ghc docs 7 6 3 html users guide pragmas html idp49866112对于 GHC 7 6 你 通常甚至一开始就不需要 SPEC
  • JQuery IE 生涩幻灯片动画

    我有以下代码来动画显示 隐藏 div headerClosed headerOpen live click function this next slideToggle slow 这将显示并隐藏具有以下标记的 div div class d
  • 登录失败。请检查您的网络连接并重试

    我正在尝试使用 Google Play 游戏服务制作简单的游戏 但无法登录 Google Play 游戏 我明白了error 登录失败 请检查您的网络连接 然后重试 我有 MainActivity 和三个片段 MainFragment Ga
  • 使用 5 个表生成查询

    我已经创建了我的表 我正在尝试创建一个查询 将已售表中的 sell quantity 和 on sale 表中的 sale price 相乘并相加 暂时将其称为 R1 将产品表中的 Retail price 和已售表中的 sell quan