按年份选择前 n%

2023-12-31

我构建了一个查询,可返回截至最近完成的月份的年初至今净销售额。查询联合发票和贷项凭证的总计。效果很好。我在另一个工具中使用查询,该工具通过卡代码求和,并允许我进行有趣的数据透视等。这是该查询:

select x.cardcode, 
       x.customer,
       case 
         when x.rep is null then (select slpname from ocrd inner join oslp on ocrd.slpcode = oslp.slpcode where ocrd.cardcode = x.cardcode)
         else
           x.rep
       end as rep, 
       x.city, 
       x.state, 
       x.country,
       case
         when isnumeric(x.total) = 0 then 0
         else x.total
       end as [net total],
       x.docdate

from (
  select t0.cardcode as cardcode, 
         t0.[cardname] as customer, 
         t1.city as city,
         t1.state as state,
         t1.country as country, 
         t4.slpname as rep, 
         sum(t3.linetotal) - t2.discsum as total,
         t2.docdate as [docdate]

  from ocrd t0  
       inner join crd1 t1 on (t0.cardcode = t1.cardcode and t0.shiptodef = t1.address) 
       left outer join oinv t2 on t0.cardcode = t2.cardcode 
       left outer join inv1 t3 on t2.docentry = t3.docentry 
       left outer join oslp t4 on t2.slpcode = t4.slpcode

  where t0.[cardtype] = 'C' and 
            t1.adrestype = 'S' 

  group by t0.cardcode, t0.cardname, t1.city, t1.state, t1.country, t4.slpname, t2.discsum, t2.docdate

  union all

  select t0.cardcode as cardcode, 
         t0.cardname as customer, 
         t1.city as city,
         t1.state as state, 
         t1.country as country,
         t4.slpname as rep, 
         -1*(sum(t3.linetotal) - t2.discsum) as total,
         t2.docdate

  from ocrd t0  
      inner join crd1 t1 on (t0.cardcode = t1.cardcode and t0.shiptodef = t1.address) 
      left outer join orin t2 on t0.cardcode = t2.cardcode 
      left outer join rin1 t3 on t2.docentry = t3.docentry 
      left outer join oslp t4 on t2.slpcode = t4.slpcode

  where t0.[cardtype] = 'C' and 
          t1.adrestype = 'S' 

  group by t0.cardcode, 
           t0.cardname, 
           t1.city,
           t1.state, 
           t1.country,
           t4.slpname, 
           t2.discsum,
           t2.docdate) x 

where (x.docdate between '2008/01/01' and dateadd(day, -1, '2008/' + cast(month(getdate()) as varchar(2)) + '/01')
        or x.docdate between '2009/01/01' and dateadd(day, -1, '2009/' + cast(month(getdate()) as varchar(2)) + '/01')
          or x.docdate between '2010/01/01' and dateadd(day, -1, '2010/' + cast(month(getdate())  as varchar(2)) + '/01'))

group by x.cardcode, x.customer, x.rep, x.city, x.state, x.country, x.total, x.docdate

现在,我想修改查询以返回每年客户净总额的前 n 个(例如 20%)。这就是我遇到麻烦的地方。我正在使用 SQL Server,所以首先我想我会尝试使用 row_number() over(partition.... 但我还没有完全正确(我知道它不正确,因为我可以根据我正在逆向工程的报告检查它) ). 这是我的第一次尝试:

select m.Cardcode, m.Customer, m.Rep, m.City, m.State, m.Country, m.Nettotal as 'Net Total', m.docdate as 'Posting Date'
from (
  select t.cardcode, t.customer, t.rep, t.city, t.state, t.country, t.nettotal, t.docdate, row_number() over(partition by t.docdate order by t.nettotal desc) as rownum
  from (
      select x.cardcode, 
             x.customer,
             case 
               when x.rep is null then (select slpname from ocrd inner join oslp on ocrd.slpcode = oslp.slpcode where ocrd.cardcode = x.cardcode)
               else
                 x.rep
             end as rep, 
             x.city, 
             x.state, 
             x.country,
             case
               when isnumeric(x.total) = 0 then 0
               else x.total
             end as nettotal,
             x.docdate

      from (
        select t0.cardcode as cardcode, 
               t0.[cardname] as customer, 
               t1.city as city,
               t1.state as state,
               t1.country as country, 
               t4.slpname as rep, 
               sum(t3.linetotal) - t2.discsum as total,
               t2.docdate as docdate

        from ocrd t0  
             inner join crd1 t1 on (t0.cardcode = t1.cardcode and t0.shiptodef = t1.address) 
             left outer join oinv t2 on t0.cardcode = t2.cardcode 
             left outer join inv1 t3 on t2.docentry = t3.docentry 
             left outer join oslp t4 on t2.slpcode = t4.slpcode

        where t0.[cardtype] = 'C' and 
                  t1.adrestype = 'S' 

        group by t0.cardcode, 
                 t0.cardname, 
                 t1.city, 
                 t1.state, 
                 t1.country, 
                 t4.slpname, 
                 t2.discsum, 
                 t2.docdate

        union all

        select t0.cardcode as cardcode, 
               t0.cardname as customer, 
               t1.city as city,
               t1.country as country,
               t1.state as state, 
               t4.slpname as rep, 
               -1*(sum(t3.linetotal) - t2.discsum) as total,
               t2.docdate

        from ocrd t0  
            inner join crd1 t1 on (t0.cardcode = t1.cardcode and t0.shiptodef = t1.address) 
            left outer join orin t2 on t0.cardcode = t2.cardcode 
            left outer join rin1 t3 on t2.docentry = t3.docentry 
            left outer join oslp t4 on t2.slpcode = t4.slpcode

        where t0.[cardtype] = 'C' and 
                    t1.adrestype = 'S' 

        group by t0.cardcode, 
                 t0.cardname, 
                 t1.city,
                 t1.state, 
                 t1.country,
                 t4.slpname, 
                 t2.discsum,
                 t2.docdate) x 

  where (x.docdate between '2008/01/01' and dateadd(day, -1, '2008/' + cast(month(getdate()) as varchar(2)) + '/01')
            or x.docdate between '2009/01/01' and dateadd(day, -1, '2009/' + cast(month(getdate()) as varchar(2)) + '/01')
              or x.docdate between '2010/01/01' and dateadd(day, -1, '2010/' + cast(month(getdate())  as varchar(2)) + '/01'))

  group by x.cardcode, 
           x.customer, 
           x.rep, 
           x.city, 
           x.state, 
           x.country, 
           x.total, 
           x.docdate) as t
) as m

where rownum <= 20

即使我做对了,沿着这条路走下去也是很麻烦的,因为它不允许我获得前 n%,只能获得前 n。

我还没有尝试使用交叉应用或子选择来实现我想要的结果。

有人可以帮我解决这个问题吗?此外,它的编写方式可能效率不高,并且硬编码的日期范围选择也不是一个好的解决方案。我想还有很多需要改进的地方:)

感谢您的帮助。


如果您需要更多的单独百分比(假设为 17%),您可以使用 row_number 和 count:

with cSalesPerYear as (
    select  s.Year, c.Customer,
            RankNo = rank() over (partition by s.Year order by S.Amount desc),
            RowNo = row_number() over (partition by s.Year order by S.Amount desc),
            CountOrders = count() over (partition by s.Year)
    from    dbo.Customers c
    inner join dbo.Sales s
        on  s.CustomerID = c.CustomerID
)
select  *
from    cSalesPerYear
where   RowNo <= @Percentage * CountOrders
     -- RankNo <= @Percentage * CountOrders --<-- "with ties" version
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按年份选择前 n% 的相关文章

  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • 通过 osql.exe 运行脚本时出现问题

    我尝试以这种格式运行我的软件的更新脚本 osql exe i path to script U 用户 P 密码 S sqlserver 位置 d 数据库名称 n b 大多数脚本的格式相同 并且都以 GO 结尾 其中很多都运行得很好 但随机脚
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • SQL 2008全文索引填充延迟

    我的经理说 在基础表数据更改后 可能需要一段时间才能更新全文搜索索引 例如 如果我有一张桌子Products有一个柱子Description我更新了该描述 然后我可能需要一些时间才能搜索该新描述 真的吗 这需要多长时间 SQL 2008 对
  • 根据日期顺序排名

    我的数据如下 Heading Date A 2009 02 01 B 2009 02 03 c 2009 02 05 d 2009 02 06 e 2009 02 08 我需要如下排名 Heading Date Rank A 2009 02
  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • SQL返回两行之间的秒差

    这个问题与SQL Server有关 我有下表 id size batch code product code additiontime 1 91 55555 BigD Red 2017 05 15 13 00 00 2 91 55555 B
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 更改列时快速删除并重新创建多个索引、视图、统计信息

    我的 项目 表中有一个 StoreNumber 列 我想将其更改为 NOT NULL 我最近清理了所有旧数据 以便不存在空条目 但是 当我执行以下语句时 由于对各种视图 索引和统计信息的多重依赖 它失败了 ALTER TABLE Proje
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • 是否有适用于 SQL Server Express 的 SQL Server Profiler? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 SQL Server Express 的 SQL Server Profiler 也许是开源的 或者也许只是一个可以帮助我查
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 我可以从 SQL Server 读取元数据来了解最后更改的行/表吗?

    我们有一个数据库hundreds的桌子 有没有某种metaSQL Server 中的数据源 我可以以编程方式查询以获取名称最后更改表和行 或者我们是否需要实施这个我们自己每个表中的字段称为上次更改日期时间 etc 就查明表最后一次修改的时间
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q

随机推荐

  • 如何获取请求头、远程地址和其他HttpServletRequest特定信息?

    我有一个 JSF 2 0 Web 项目 我的 Web 有一个表单 它必须执行以下操作 获取表单的参数并将其保存在Bean中 完成 从 servlet 获取此信息 远程地址 远程主机 区域设置 内容类型 边界 内容长度 字符编码 将Bean数
  • 当后缀缺失时,编译器选择前缀 ++ - 谁说的?

    当您为用户定义类型定义前缀运算符 并且不提供后缀版本时 编译器 至少在 Visual C 中 将在您的代码调用缺少的 POSTFIX 版本时使用 PREFIX 版本 至少它会给你一个警告 但是 我的问题是 为什么它不给你一个未定义成员函数的
  • 如何处理 groovy 方法中的多个返回类型?

    我需要一种方法 在成功时返回 Id 在失败时返回错误列表 前代码片段 def save def errors if Employee save flush true return Employee id else errors add Ca
  • 在 Silverlight 中显示 ® 符号

    Folks 我正在尝试在我的 silverlight 应用程序中显示 和上标 TM 符号 我想将包含符号的文本保存在 resx 文件中 我尝试过的事情 将任何文档中的 符号复制粘贴到 resx 文件中 符号得到 显示在 resx 文件中 但
  • 获取方括号的内容,避免嵌套括号

    第一次发帖 来自 Google 的长期访客 我正在尝试提取一些方括号的内容 但是我遇到了一些麻烦 我已经让它适用于圆括号 如下所示 但我看不出应该如何修改它以适用于方括号 我本以为在这个例子中用圆形替换方形 反之亦然应该可行 但显然不行 它
  • 使用单个 flatMap() 比使用 map().flatMap() 更好吗?

    我想知道两种平面映射情况之间是否存在显着差异 Case 1 someCollection stream map CollectionElement getAnotherCollection flatMap Collection stream
  • 用户安装软件时自动安装依赖项(.Net)

    我正在使用 Net 3 5 c WPF 构建一个软件 我的软件需要用户安装 Net 3 5 和 Media Player 11 我想构建一个安装程序 在用户安装主软件时自动安装这两个组件 我该如何解决这个问题 该组件 1 Net 3 5 2
  • 如何在 C# 中生成 WSDL 而不发出 http 请求

    问候 我想编写一个单元测试来确保我们的 Web 服务没有更改上次已知发布版本的 WSDL 原因是对 WSDL 中对象的任何更改都会导致使用 Apache Axis 的客户端失败 即使您所做的只是添加一个不需要的属性 因此 如果发生更改 则需
  • 组合两个 def 后扁平化类型

    以下是一个玩具示例 用于演示现实生活中遗留方法的形状怪异和问题的要点 如你看到的anotherFunc 映射结束后personList将类型扩展为 Throwable List Throwable String 这不是预期的返回类型 而是效
  • 什么是 deep_ping [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我不确定这是否是提问的正确论坛 但我也不知道在哪里提问 所以这是我的问题 深平 是什么意思 我尝试了谷歌 但仍然没有得到任何有关它的信息 另外 深度
  • DataTemplate 中的 TextBlock 忽略了 FontSize 样式

    TextBlock 的样式 如下 对 DataTemplate 的 TextBlock 没有影响 如果我在样式和模板中将 TextBlock 更改为 TextBox 则样式将按我的预期应用 为什么 TextBlock 会忽略样式 谢谢你 B
  • Android 撰写文本的自动链接

    有什么办法可以使用吗安卓 自动链接JetPack Compose Text 上的功能 我知道 在一个简单的标签 修饰符中使用此功能可能不是 声明性方式 但也许有一些简单的方法 对于文本样式我可以使用这种方式 val apiString An
  • 获取 R 中均值子组的均值

    我是 R 的新手 我不知道如何让 R 计算子组的平均值 而子组本身就是子组的平均值 我会解释得更清楚 我有一个像这样的数据框 GROUP WORD WLN 1 1 4 1 1 3 1 1 3 1 2 2 1 2 2 1 2 3 2 3 1
  • Python在同一个图上并排箱线图

    我正在尝试在 Python 2 7 中为下面 Pandas 数据框中 E 列中的每个分类值生成一个箱线图 A B C D E 0 0 647366 0 317832 0 875353 0 993592 1 1 0 504790 0 0418
  • Python - 反转列表中字符串的函数

    疯狂地学习Python 并且有很多很多的问题 这次关于函数 我需要创建两个函数 第一个函数用于数字来总结用户在列表中输入的所有内容 第二个函数是用户在列表中输入一些单词 并且函数不触及列表中的单词索引 取每个函数单词并返回相反的单词 在同一
  • Tensorflow - 平均恢复模型的模型权重

    鉴于我在相同的数据上训练了多个不同的模型 并且我训练的所有神经网络都具有相同的架构 我想知道是否可以恢复这些模型 平均它们的权重并使用平均值初始化我的权重 这是图表外观的示例 基本上我需要的是我要加载的重量的平均值 import tenso
  • javascript中的dispatchEvent所有元素

    有没有办法调度所有元素 例如 我们可以这样做window dispatchEvent evt 但我想允许所有元素使用该事件 对于onclick 我们可以使用几乎所有元素 var evt document createEvent MouseE
  • 如何循环遍历 JSON 中的条目?

    我想循环 JSON 文件的内容并将其打印到控制台 我想我确实把一些东西和列表混淆了 这就是我试图得到的所有team name元素 from urllib2 import urlopen import json url http openli
  • Python 子进程调用,参数具有多个引号

    我在 bash 中使用以下命令来执行 Python 脚本 python myfile py c USA g CA 0 2011 10 13 1 2011 10 27 我正在编写一个 Python 脚本来解决这个问题 我目前不得不使用 os
  • 按年份选择前 n%

    我构建了一个查询 可返回截至最近完成的月份的年初至今净销售额 查询联合发票和贷项凭证的总计 效果很好 我在另一个工具中使用查询 该工具通过卡代码求和 并允许我进行有趣的数据透视等 这是该查询 select x cardcode x cust