看园中SQL Server大V潇潇隐者的博文,发现一边文就是描述了如标题描述的问题

 
具体的问题描述我通过潇潇隐者的博文的截图来阐释:
注意:如果以上截取有所侵权,也请作者告知,再次感谢。
 
当看到这个问题的,我想到了是窗口函数提供的累积汇总有关的解决方案。
 
准备测试数据,有关的T-SQL代码如下:
 IF OBJECT_ID(N'dbo.SalesData', N'U') IS NOT NULL
BEGIN
DROP TABLE dbo.SalesData;
END
GO CREATE TABLE dbo.SalesData
(   
Product_Name CHAR(32) NOT NULL, --商品名称   
Sale_Amount FLOAT NOT NULL   --销售金额
);
GO INSERT INTO dbo.SalesData (Product_Name, Sale_Amount)
SELECT 'ProductNameA', 13000 UNION ALL
SELECT 'ProductNameA', 12000 UNION ALL
SELECT 'ProductNameA', 9000 UNION ALL
SELECT 'ProductNameB', 167000 UNION ALL
SELECT 'ProductNameB', 137000 UNION ALL
SELECT 'ProductNameB', 107000 UNION ALL
SELECT 'ProductNameC', 78000 UNION ALL
SELECT 'ProductNameC', 12000;
GO

执行以下的T-SQL代码:

 SELECT Product_Name, Sale_Amount
FROM dbo.SalesData;
GO

得到的结果如下:

 
注意:以上测试数据也是来自潇潇隐者的博文,我再次基础上做了调整。
 
基于SQL Server 2005和以上的版本的解决方案的T-SQL代码如下:
 -- SQL Server 2005 和以上版本 使用子查询的解决方案
SELECT *
FROM (
SELECT T.Product_Name, T.Sale_Amount, T.rownum, T.Sale_TotalAmount, T.Sale_AccumulateAmount
,100.0 * T.Sale_AccumulateAmount / T.Sale_TotalAmount AS Sale_AccumulatePercent
FROM (
SELECT T.Product_Name, T.Sale_Amount, ROW_NUMBER() OVER (ORDER BY T.Sale_Amount DESC) AS rownum, T2.Sale_TotalAmount
,(SELECT SUM(Sale_Amount) FROM dbo.SalesData WHERE Sale_Amount >= T.Sale_Amount) AS Sale_AccumulateAmount
FROM dbo.SalesData AS T
CROSS APPLY (SELECT SUM(Sale_Amount) AS Sale_TotalAmount FROM dbo.SalesData) AS T2
) AS T
) AS T
WHERE T.Sale_AccumulatePercent <= 80;
GO

执行后的查询结果如下:

 
基于SQL Server 2012和以上的版本的解决方案的T-SQL代码如下:
 -- SQL Server 2012 和以上 使用增强的窗口函数的解决方案
SELECT T.Product_Name, T.Sale_Amount, T.rownum, T.Sale_TotalAmount, T.Sale_AccumulateAmount, T.Sale_AccumulatePercent
FROM (
SELECT T.Product_Name, T.Sale_Amount, T.rownum, T.Sale_TotalAmount, T.Sale_AccumulateAmount
,100.0 * T.Sale_AccumulateAmount / T.Sale_TotalAmount AS Sale_AccumulatePercent /*累计销售额在总销售中的百分比*/
FROM (
SELECT Product_Name, Sale_Amount, ROW_NUMBER() OVER (ORDER BY Sale_Amount DESC) AS rownum /*行号行数,具有不确定性,窗口排序字句列不唯一*/
,SUM(Sale_Amount) OVER () AS Sale_TotalAmount /*总销售额*/
,SUM(Sale_Amount) OVER (ORDER BY Sale_Amount DESC ROWS UNBOUNDED PRECEDING) AS Sale_AccumulateAmount /* 累计销售额,使用了SQL Server 2012窗口函数新增的窗口框架字句,也等同于 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW*/
FROM dbo.SalesData
) AS T
) AS T
WHERE T.Sale_AccumulatePercent <= 90;
GO

执行后的查询结果如下:

 
博友有其他的解决方案,也请不吝赐教,万分感谢。

SQL Server求解最近多少销售记录的销售额占比总销售额的指定比例的更多相关文章

  1. 在SQL Server中快速删除重复记录

     在SQL Server中快速删除重复记录 2006-07-17 21:53:15 分类: SQL Server 开发人员的噩梦——删除重复记录 想必每一位开发人员都有过类似的经历,在对数据库进行查询 ...

  2. 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期

    腾讯云图片鉴黄集成到C#   官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...

  3. SQL Server 无法连接到服务器。SQL Server 复制需要有实际的服务器名称才能连接到服务器。请指定实际的服务器名称。

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html SQL性能优化汇总篇:http://www.cnblogs.com/dunit ...

  4. SQL Server 怎么在分页获取数据的同时获取到总记录数

    SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SE ...

  5. sql server使用中遇到的问题记录

    一.sql server 不能连接远程服务器,但可以连接本地的数据库 我目前用的是sql server 2012 sp1,用着用着突然就不能连接远程服务器上的数据库了,崩溃了一天... 修复试了,卸载 ...

  6. 阿里云服务器,Sql Server 本地连接服务器端问题记录

    1.如果你是阿里云服务器,配置参数都整好了并且排除了防火墙问题(关闭了防火墙),依然没有连接上,那就先考虑这个问题 问题:阿里云服务器的SQLServer不允许远程连接 原因:因为除了服务器上的防火墙 ...

  7. SQL Server 2008R2 附件数据库问题记录

    在Sql Server 2008 R2里附加数据库时弹出xxx.mdf拒绝访问的错误 详细错误信息如下: TITLE: Microsoft SQL Server Management Studio-- ...

  8. SQL Server 数据库开启日志CDC记录,导致SQL Server 数据库日志异常增大

    这几天单位的SQL Server业务数据生产库出现数据库日志增长迅速,导致最终数据无法写入数据库,业务系统提示"数据库事务日志已满",经过多方咨询和请教,终于将日志异常的数据库处理 ...

  9. SQL Server求解连续操作(登录)数量(次数)最大的记录(用户)问题

    在园中大V深蓝医生中的一篇文中发现了这个问题,感觉挺有意思. 问题简化为"求解连续日期登录次数最大的用户".至少连续2天都登录才能认为是连续日登录. 数据岛问题 这个问题让我联想到 ...

随机推荐

  1. TabControl 显示彩色的图示 (XE6 Firemonkey)

    提示:Delphi 10 Seattle 透过 TImageList 来指定图标,就能显示原来图标的颜色. 下列方法只适用于 XE6 XE6 Firemonkey 里的 TabControl 可以将切 ...

  2. vim快捷键整理(转载)

    一.移动光标 1.左移h.右移l.下移j.上移k2.向下翻页ctrl + f,向上翻页ctrl + b3.向下翻半页ctrl + d,向上翻半页ctrl + u4.移动到行尾$,移动到行首0(数字), ...

  3. 2016 年青岛网络赛---Tea

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5881 Problem Description Tea is good. Tea is life. Te ...

  4. HDU 4283---You Are the One(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4283 Problem Description The TV shows such as Y ...

  5. 用SQL语句添加删除修改字段_常用SQL

    1.增加字段     alter table docdsp     add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME DROP COLUMNc ...

  6. Node.js的UnitTest单元测试

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; } 在专业化的软件开发过程中,无论什么平台语言,现在都需要UnitTes ...

  7. rabbitmq inequivalent arg 'x-message-ttl' for queue 'QUEUE_NAME' in vhost '/'异常解决

    中午调整了一台应用服务的mq ttl参数后,重启时出现如下异常: Caused by: com.rabbitmq.client.AlreadyClosedException: channel is a ...

  8. ajax传参到实体类对应字段

    之前看公司的代码,从页面ajax传参数到接口类,接口类用一个实体接收.我一直以为c#会自动识别,赋值到同名的字段. 我曾和朋友讨论过,双方辩论.朋友认为c#没有这种功能,没有这样高级匹配的机制.而我因 ...

  9. 【特别推荐】几款极好的 JavaScript 下拉列表插件

    表单元素让人爱恨交加.作为网页最重要的组成部分,表单几乎无处不在,从简单的邮件订阅.登陆注册到复杂的需要多页填写的信息提交功能,表单都让开发者花费了大量的时间和精力去处理,以期实现好用又漂亮的表单功能 ...

  10. 2013年最新流行的响应式 WordPress 主题【上篇】

    WordPress 是最流行的内容管理系统,经历了多年的发展和演变.它的成功体现在庞大的社区,数百万的用户,设计师和开发者推动着 WordPress 往更高的层次发展. 海量的免费主题是 WordPr ...