如何在存储过程中循环访问表?

2023-12-02

这个问题是从this one.

我有两个表需要查询并从中收集一些计算所得的总和;我需要一个基于单位的结果集——每个单位一行,并将它们的计算数据折叠到该行中。

这两个表包含以下相关成员:

客户类别日志:

Unit        varchar(25)
MemberNo    varchar(10)
Category    varchar(50)
Subcategory varchar(50)
BeginDate   Datetime
EndDate     Datetime

报告每月销售额:

Unit (VarChar)
MemberNo (VarChar)
MonthlySales (Money)
CYear (Int)
Cmonth (Int)

对于每个单元(两个表中都有许多行,每个单元对应一个 MemberNo,但在结果集中包含一行),我需要填充四列:New、Assumed、Existing 和 Organic。这些值是基于属于相应“子类别”字段的单元所有成员的总和。 CustomerCategoryLog 表的 BeginDate/EndDate 值用于确定单位/成员在评估的月份/年份期间属于哪个子类别。

因此,结果集的简化形式如下所示:

Unit    New  Assumed        Existing    Organic     Total
----    ---  -------        --------    -------     -----
Abuelos $22  $44            $33         $11         $110
Gramps  $12  $23            $1          $34         $70
. . .

把这个问题用英语表达的话,就是这样的:

给定用户提供的月份和年份(例如“1”代表月份(一月),“2016”代表年份),找出每个单位该月内每个子类别的每月销售额有多少美元(其中BeginDate 小于或等于用户提供的月/年日期,并且 EndDate 大于或等于提供的月/年日期。

因此,我似乎需要从年/月参数创建一个日期,以便与 CustomerCategoryLog 表中的 BeginDate 和 EndDate 值进行比较(另一个选项是更改 CustomerCategoryLog 表,以便它具有 BeginDateMonth、BeginDateYear、EndDateMonth和 EndDateYear 整数;但我认为必须有一种简单的方法来根据提供的年/月参数创建日期)。

我的问题是如何在 TSQL 中实际构建它。我不是 SQLhead,我最好的(伪 SQL)尝试是:

DECLARE @Unit varchar(30);
DECLARE @Year Int;
DECLARE @Month Int;
. . .
DECLARE @PARAMDATE DATETIME = (Year + Month + 01).ToDateTime();

SELECT DISTINCT UNIT INTO #UNITS U FROM ReportingMonthlySales
WHILE NOT U.EOF DO

Unit = U.Unit

SELECT Unit, MonthlySales as 'NewSales' FROM (SELECT MonthlySales FROM ReportingMonthlySales RMS left join     
CustomerCategoryLog CCL on RMS.Unit = CCL.Unit WHERE RMS.Unit = Unit AND RMS.CYear = @Year and RMS.CMonth = @Month     
AND CCL.BeginDate >= PARAMDATE AND CCL.EndDate <= PARAMDATE AND CCL.Subcategory = 'New'),

MonthlySales as 'AssumedSales' FROM (SELECT MonthlySales FROM ReportingMonthlySales RMS left join     
CustomerCategoryLog CCL on RMS.Unit = CCL.Unit WHERE RMS.Unit = Unit AND  RMS.CYear = @Year and RMS.CMonth = @Month     
AND CCL.BeginDate >= PARAMDATE AND CCL.EndDate <= PARAMDATE AND CCL.Subcategory = 'Assumed'),

MonthlySales as 'ExistingSales' FROM (SELECT MonthlySales FROM ReportingMonthlySales RMS left join     
CustomerCategoryLog CCL on RMS.Unit = CCL.Unit WHERE RMS.Unit = Unit AND  RMS.CYear = @Year and RMS.CMonth = @Month     
AND CCL.BeginDate >= PARAMDATE AND CCL.EndDate <= PARAMDATE AND CCL.Subcategory = 'Existing'),

MonthlySales as 'OrganicSales' FROM (SELECT MonthlySales FROM ReportingMonthlySales RMS left join     
CustomerCategoryLog CCL on RMS.Unit = CCL.Unit WHERE RMS.Unit = Unit AND  RMS.CYear = @Year and RMS.CMonth = @Month     
AND CCL.BeginDate >= PARAMDATE AND CCL.EndDate <= PARAMDATE AND CCL.Subcategory = 'Organic')
FROM ReportingMonthlySales RMS2
ORDER BY RMS2.Unit

END WHILENOTEOF

我知道这不太正确,甚至可能根本不正确,但希望它对于 SQL 专家/初级人员来说足够清楚。读心术以了解我需要做什么/正在尝试做什么。

UPDATE

以下是查询的两个表中的一些示例数据:

客户类别日志表:

MemberNo = 007
Unit = AMC THEATERS
Subcategory = New
BeginDate = 1/1/2016
EndDate = 12/31/2016

MemberNo = 029
Unit = FOODBUY HMS
Subcategory = Existing
BeginDate = 1/1/2015
EndDate = 12/31/2015

报告每月销售表:

Unit = AMC THEATERS
MemberNo = 007
MonthlySales  = $988.82
CYear = 2016
Cmonth = 1

Unit = FOODBUY HMS
MemberNo = 029
MonthlySales  = $61,479.28
CYear = 2017
Cmonth = 3

这看起来像是一个漫长的转型之路。

像这样的事情怎么样?

declare @Unit varchar(30);
declare @Year int;
declare @Month int;
declare @paramdate datetime = datefromparts(@year, @month, 1);
/* --prior to sql server 2012
declare @paramdate datetime;
set @paramdate = convert(datetime,convert(char(4),@Year)
                +right('0'+convert(varchar(2),@month),2)
                +'01') 
*/

select distinct unit
into #Units
from ReportingMonthlySales;

select 
    u.Unit
  , New      = sum(case when ccl.Subcategory = 'New'      then rms.MonthlySales else 0 end)
  , Assumed  = sum(case when ccl.Subcategory = 'Assumed'  then rms.MonthlySales else 0 end)
  , Existing = sum(case when ccl.Subcategory = 'Existing' then rms.MonthlySales else 0 end)
  , Organic  = sum(case when ccl.Subcategory = 'Organic'  then rms.MonthlySales else 0 end)
from #Units u
  left join CustomerCategoryLog ccl 
    on u.Unit = ccl.Unit
   and @paramdate >= ccl.begindate
   and @paramdate <= ccl.enddate
  left join ReportingMonthlySales rms
    on u.Unit = rms.Unit
   and rms.cyear  = @year
   and rms.cmonth = @month
group by u.unit;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在存储过程中循环访问表? 的相关文章

  • 在 C# 中读取大型 SQL 脚本文件

    我正在尝试阅读一个大脚本 到目前为止我已经尝试了两种选择 选项1 由于内存空间不足的问题 我们无法在SQL Management Studio中打开大型脚本文件 所以最初我使用sqlcmd在远程主机上执行 160 mb SQL 脚本文件 5
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • 如何将 数组传递给存储过程

    我有一个清单索赔数据在 C 中 它有三个项目 日期 类型和描述 其中可以有多行 如下所示 索赔数据 Date Type Description 01 02 2012 Medical Its a medical 05 02 2013 Thef
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • 弹簧隔离支持吗? SQL快照隔离

    我们正在使用 SQL Server 快照隔离可能是提高性能和解决一些死锁问题的好方法 假设我们确实需要更改为快照隔离 我似乎找不到一种简单的方法来在 Springs 上启用快照隔离 Transactional 我发现以下 hibernate
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • 数字表与递归 CTE 生成一系列数字

    为什么使用数字表比使用递归 CTE 动态生成它们要快得多 在我的机器上 给定一张桌子numbers单列n 主键 包含从1到100000的数字 查询如下 select n from numbers 大约需要 400 毫秒才能完成 使用递归 C
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • 想要编写依赖于 SQL Server 表的所有对象的脚本

    查看依赖关系 显示依赖于 SQL Server 中的表的所有对象 现在 我如何使用 SSMS 在一个命令中编写所有这些对象的脚本 有没有免费的工具可以做到这一点 首先你可以尝试这个链接了解 SQL 依赖关系 http msdn micros
  • 使用 TSQL 选择 XML 节点

    我的 SQL Server 2008 数据库表有一个 XML 字段 我想从该字段以及其他字段中选择节点 例如 考虑下表 DECLARE TestTable AS TABLE Id VARCHAR 20 Name XML INSERT INT
  • 使用默认路径中的文件创建数据库

    我想创建一个创建数据库的 SQL 脚本 现在 我有这个 CREATE DATABASE Documents ON PRIMARY NAME N Documents FILENAME N Documents mdf LOG ON NAME N
  • 返回日期为 null 作为 t-sql 中的最大值

    我有这张桌子 ID Date Value 3241 9 17 12 5 3241 9 16 12 100 3241 9 15 12 20 4355 9 16 12 12 4355 9 15 12 132 4355 9 14 12 4 100
  • WHERE 值不在(子查询)

    我一直在努力解决这个问题 我有两张桌子 一张带有优惠券和发票号码的 一张带有发票号码和客户姓名的 我需要找到尚未使用优惠券的顾客 以下是表格 促销表 Promotions Invoice Coupon 1 couponA 2 couponB
  • 在 SQL Server 中选择 XML 元素

    我有一些 XML 需要使用 SQL Server 2008 进行解析 我想我已经接近得到我想要的了 但是我没有正确的语法 我相信 我有以下内容 DECLARE doc XML SET doc
  • 如何在 sql 2005 或 2008 中使列区分大小写

    是否可以根据列更改默认排序规则 我想让 1 列区分大小写 但其他所有列都不区分大小写 ALTER TABLE ALTER COLUMN允许更改单个列的排序规则 alter table Foo alter column Bar ntext c
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • SQL Server 选择所需存储过程的查询帮助

    我正在努力解决在存储过程中构造 sql select 查询所需的逻辑 我的数据库使用股票市场数据 我有一个 2012 年交易日期表 一个股票代码表以及一个通过网络服务列出这些代码和交易日期的每日定价数据表 我正在尝试从我正在处理的选择查询中
  • 发布Oracle和SQL Server性能测试是否违反许可? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对Oracle和SQL Server中的空间索引进行性能测试 我想将其纳入我的理学硕士工作中 发布此类结果是否违反 dbms 的许可 也许有人已经
  • SQL Server 列的默认随机 10 个字符串值

    我有一个专栏rndm在我的桌子上 客人 现在 对于领域Default value or Binding对于表 每当插入新行时 我想自动将 10 个字符的随机字符串插入到该列中作为默认值 该随机字符串不能包含特殊字符 只能包含以下字符a zA

随机推荐

  • SVN 提交未完成

    当我在 svn 中提交文件时 我经常遇到这样的情况 在传输完所有文件后 svn 将挂起 然后最终超时并出现错误svn E175012 Connection timed out 当我上传超过 20 个文件时 似乎会发生这种情况 我相信这是在所
  • C - 将字符串拆分为字符串数组

    我不完全确定如何在 C 中执行此操作 char curToken strtok string curToken ls l we will say I need a array of strings containing ls l and N
  • c++ static_assert 在“if constexpr 语句”的两个分支上均失败

    我试图在编译时确定特定类型是否属于类型标准 对 当我编译下面的代码时 两个分支 即 HERE1 和 HERE2 上的断言均失败 如果我删除 static asserts 并取消注释打印 我会得到我所期望的 这是 HERE1 的is pair
  • 使用三角形网格纹理,无需读/写图像文件

    这是上一个问题的后续 请参阅在javafx上为三角形网格中的各个三角形着色 我认为这本身就是另一个话题 有没有一种方法 使用javafx 可以让我不必实际将图像文件写入磁盘 或外部设备 来使用纹理 换句话说 我可以使用特定的纹理而不必使用图
  • 加载网页,执行其 JavaScript 并将生成的 HTML 转储到文件

    我需要加载一个网页 执行其 JavaScript 以及标签中包含的所有 js 文件 并将生成的 HTLM 转储到文件中 这需要在服务器上完成 我已经尝试过使用node js和zombie js 但它似乎太不成熟 无法在现实世界中工作 通常
  • C# 在特定情况下使用小数位格式化百分比

    在我正在构建的应用程序中 我需要按以下方式格式化百分比 00012 gt 0 01 0012 gt 0 12 012 gt 1 2 12 gt 12 1 12 gt 112 小于 1 的百分比应显示 2 位小数 任何 1 或大于 1 的值都
  • 动态加载数据到Gridview

    当我在 gridview 上工作时 我遇到了以下问题 任何帮助将不胜感激 当我将数据加载到 gridview 时 它仅加载数组的前 3 个项目 但还有 18 个项目需要加载 为什么它不加载其他 15 个项目 Log i 显示了我的 LogC
  • 使用 .AddIdentityServerJwt() 时,.NET Core Razor Pages 应用程序的身份验证不适用于没有“/Identity”路由的视图

    使用 NET Core 3 1 框架 我尝试使用以下设置配置 Web 平台 Razor Pages 应用程序 充当平台的登陆页面 具有平台广告 cookie 同意 隐私政策 联系人以及身份附带的页面 例如登录 注册 管理帐户 等功能 页面
  • 如何在 htaccess 中的 #ancors 和 ?queries 之前从 ulrs 中删除 *.php、index.php 和尾部斜杠

    我无法为我的问题找到令人满意的答案 已经上网冲浪三天了 但没有发现任何实际有效的东西 我的网站结构如下 data controllers helpers partials layouts images javascripts stylesh
  • Scrapy 获取网站时出现错误“DNS 查找失败”

    我正在尝试使用 Scrapy 获取 DNS 查找失败 网站上的所有链接 问题是 每个没有任何错误的网站都打印在解析对象方法 但当 url 返回 DNS 查找失败时 回调parse obj 没有被调用 我想获取所有出现错误的域 DNS 查找失
  • 使用 Python ssl 库时“SSLError: [SSL] PEM lib (_ssl.c:2532)”是什么意思?

    我正在尝试使用 Python 3 asyncio 模块连接到另一方并收到此错误 36 sslcontext ssl SSLContext ssl PROTOCOL TLSv1 gt 37 sslcontext load cert chain
  • 查询返回特定值在字符串中出现的次数?

    好吧 我有两张桌子 表 1 具有参考数字列 A 第二列具有随机性字符串 B Table2 只有一列 其中的值列表可能位于也可能不位于 Table1 的字符串中 dbo Tbl 1 A B 24 BLUE KITTEN WHITE PINK
  • TornadoFX 未解决的 JavaFx

    我想创建一个应该是桌面应用程序的新项目 为此 我选择了 Kotlin 语言和 TornadoFX 框架 我已经安装了TornadoFX插件并创建了一个新的 Ttornadofx gradle project Intellij 的基本设置是成
  • 非动态自定义 HTTP 标头

    根据这个Ogg 媒体上的 Mozilla 文章 媒体在浏览器中可以更加无缝地工作X Content Duration标题 给出该片段的长度 以秒为单位 假设我将该长度存储在某个地方 当然在数据库中 也许也在文件名本身中 video file
  • 数据库陷入“正在恢复”状态

    我备份了一个数据库 BACKUP DATABASE MyDatabase TO DISK MyDatabase bak WITH INIT overwrite existing 然后尝试恢复它 RESTORE DATABASE MyData
  • 我想处理ios中的通话状态

    我想获取电话的状态 无论是已拨 已连接还是已断开 我尝试了自己 但无法获得状态 NSString phoneNumber telprompt stringByAppendingString 9723539389 UIApplication
  • 剧作家:可以为 1 次测试指定工作人员数量或浏览器吗?

    我的套件设置为使用 3 个工作线程 2 个桌面和 2 个移动设备 针对 4 个浏览器运行 我有一个测试 我需要要么不并行运行 要么限制只在一个桌面浏览器中运行 那可能吗 我需要这样做的原因是测试正在触发一个可能需要几秒钟才能运行的事件 运行
  • 通过 gmail 在 CodeIgniter 中发送电子邮件

    我正在按照教程使用 gmail 发送电子邮件 但是我得到的页面只是挂起 甚至没有加载错误 我正在使用 MAMP 所以这可能是它不起作用的原因 class Email extends CI Controller public function
  • 更改 JTextField 启用的背景颜色

    我有一个问题JTextField背景颜色 如何在启用的文本字段中更改它 编辑时 setBackground仅适用于禁用的文本字段 UIManager put可以更改窗口中所有文本字段的背景 但我只想对其中一个文本字段执行此操作 有多种方法可
  • 如何在存储过程中循环访问表?

    这个问题是从this one 我有两个表需要查询并从中收集一些计算所得的总和 我需要一个基于单位的结果集 每个单位一行 并将它们的计算数据折叠到该行中 这两个表包含以下相关成员 客户类别日志 Unit varchar 25 MemberNo