AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 282313
Accepted
Dave
Dave
Asked: 2020-12-30 11:33:35 +0800 CST2020-12-30 11:33:35 +0800 CST 2020-12-30 11:33:35 +0800 CST

无法对销售额字段的值求和 - 各种条件、销售代表 ID 和日期范围

  • 772

我想知道是否有人可以帮助我处理这个 SQL Server 2016 查询。

我有两个包含以下数据的表

销售代表

这是一个表格,其中包含销售代表所关注的地区的历史以及他们所关注的日期范围。

区域 ID 销售代表 从日期 迄今为止
15 安妮 2020-01-01 2020-06-02
15 戴夫 2020-06-03 2020-06-16
15 安妮 2020-06-17 2020-06-22
18 安妮 2020-06-23 2999-12-31

tbl销售额

这是包含地区销售额的表格

区域 ID 交易 ID 交易日期 产品代码 数量
15 1 2020-04-15 包 50
15 1 2020-04-15 包 50
15 2 2020-06-02 包 25
15 3 2020-06-03 鞋 60
15 4 2020-06-07 鞋 10
15 5 2020-06-17 包 15
15 6 2020-06-18 包 25
15 7 2020-06-25 外套 100
18 8 2020-06-27 包 20

我正在尝试生成一份报告,显示给定 SalesRep 的 SalesRep 和两个日期之间的总销售额。

例如,如果我提供了一个 SalesRep = 'Anne' 并且日期范围是 '1 Jun 2020' 到 '30 Jun 2020',我希望得到的结果是:

SalesRep    Sum
Anne        185

这是因为它应该排除在 2020 年 6 月 3 日至 2020 年 6 月 16 日之间进行的任何交易,因为该地区由戴夫照管了几个星期,并且他在这些日期之间进行了该业务。

我在加入 TblSalesRep 时尝试使用 SUM() 函数,但这些数字不是我所期望的。

sql-server sql-server-2016
  • 2 2 个回答
  • 85 Views

2 个回答

  • Voted
  1. Best Answer
    StephenK
    2020-12-30T12:39:39+08:002020-12-30T12:39:39+08:00

    有更紧凑的方法来编写它,但这说明了一种方法。

    首先选择 Anne 负责该地区的地区和时期。

    然后提取交易日期在 Anne 覆盖进行销售的区域的某个时期内的所有销售。

    然后总结销售额。

    WITH
     territory_periods AS (
    SELECT SalesRep, TerritoryID, FromDate, ToDate
      FROM tblSalesRep 
     WHERE SalesRep = 'Anne'
    )
    ,sales AS (
    SELECT p.SalesRep, s.Amount
      FROM tblSales s
      JOIN territory_periods p
        ON s.TerritoryID = p.TerritoryID 
       AND s.TransactionDate BETWEEN p.FromDate AND p.ToDate
    )
    SELECT SalesRep, Sum(Amount)
      FROM sales 
    GROUP
        BY SalesRep
    ;
    
    • 1
  2. Vérace
    2020-12-30T13:57:37+08:002020-12-30T13:57:37+08:00

    为了回答您的问题,我执行了以下操作(请参见此处的小提琴):

    创建和填充表格 - 您可以自己为将来的问题执行此操作 - 这真的很有帮助,消除了重复工作,还消除了复制和粘贴错误。

    我根据SQL 样式指南或多或少地稍微更改了表定义——这是我个人的偏好——我的建议是选择一种风格并坚持下去!

    CREATE TABLE sales
    (
      territory_id INT NOT NULL,
      transaction_id INT NOT NULL,
      transaction_date DATE NOT NULL,
      product_code VARCHAR (25) NOT NULL,
      amount INT NOT NULL
    );
    

    和

    CREATE TABLE sales_rep
    (
      territory_id INT NOT NULL,
      the_rep VARCHAR (10) NOT NULL,
      from_date DATE NOT NULL,
      to_date   DATE NOT NULL
    );
    

    数据:

    INSERT INTO sales VALUES
    (15,           1,              '2020-04-15',      'Bags',            50),
    (15,           1,              '2020-04-15',      'Bags',            50),
    (15,           2,              '2020-06-02',      'Bags',             25),
    (15,           3,              '2020-06-03',      'Shoes',           60),
    (15,           4,              '2020-06-07',      'Shoes',           10),
    (15,           5,              '2020-06-17',      'Bags',            15),
    (15,           6,              '2020-06-18',      'Bags',            25),
    (15,           7,              '2020-06-25',      'Coat',            100),
    (18,           8,              '2020-06-27',      'Bags',            20);
    

    和:

    INSERT INTO sales_rep VALUES
    (15,          'Anne',        '2020-01-01',  '2020-06-02'),
    (15,          'Dave',        '2020-06-03',  '2020-06-16'),
    (15,          'Anne' ,       '2020-06-17',  '2020-06-22'),
    (18,          'Anne',        '2020-06-23',  '2999-12-31');
    

    然后我运行了以下查询:

    SELECT 
      sr.the_rep AS "Rep name", SUM(s.amount) AS "Total sales"
    FROM sales s
    JOIN sales_rep sr
      ON  s.transaction_date >= sr.from_date
      AND s.transaction_date <= sr.to_date
    WHERE s.transaction_date >= '2020-06-01' AND s.transaction_date <= '2020-06-02'
    OR    s.transaction_date >= '2020-06-17' AND s.transaction_date <= '2020-06-30'
    GROUP BY sr.the_rep;
    

    结果:

    Rep name    Total sales
        Anne            185
    

    然后我用SET SHOWPLAN_TEXT ON(见小提琴)查看了两个提议的(这个和@StephenK's)答案的性能 - 计划略有不同,但我不是 SQL Server 人,所以我不知道哪个可能会更好。在任何情况下,表都非常小,以至于优化器可能使用也可能不使用它可能用于大型数据集的索引!

    我已经使用小提琴在不同版本上运行 SQL,并且不同查询的计划保持不变!

    我会敦促您使用真实的数据集测试这两种解决方案,然后从那里开始 - 在这里报告会很好!

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve