删除给定键总和为零的行

2023-11-26

我有一个查询,该查询将导致在我们的 SSRS 2008 R2 服务器上创建客户账单。 SQL Server实例也是2008 R2。查询很大,出于安全原因等原因我不想发布整个内容。

我需要对下面的示例数据执行的操作是从结果集中删除带有 73.19 和 -73.19 的两行。因此,如果两行在 LineBalance 列中具有相同的绝对值且它们的总和为 0 并且如果它们在 REF1 列中具有相同的值,则应从结果集中删除它们。 REF1 = 14598 且行余额为 281.47 的行仍应返回结果集中,并且不应返回下面 REF1 = 14598 的其他两行。

这样做的目的是向客户“隐藏”会计错误及其更正。我所说的“隐藏”是指,不要将其显示在他们通过邮件收到的账单上。这里发生的情况是,客户应该被计费为 281.47,但错误地被计费为 73.19。所以,我们的 AR 部门。将 73.19 返回到他们的帐户,并向他们收取正确的金额 281.47。正如您所看到的,它们都具有相同的 REF1 值。

An Example Of My Data


我会添加一个包含显式标志的字段,告诉您某个费用是错误/错误的逆转,然后过滤掉这些行就很简单了。即时执行可能会使您的报告变得相当慢。

但是,为了解决给定的问题,我们可以这样做。该解决方案假设SysInvNum是独特的。

创建包含示例数据的表

DECLARE @T TABLE (SysInvNum int, REF1 int, LineBalance money);

INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (3344299, 14602, 558.83);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (3344298, 14598, 281.47);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (3344297, 14602, -95.98);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (3344296, 14598, -73.19);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (3341758, 14598, 73.19);

INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (11, 100, 50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (12, 100, -50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (13, 100, 50.00);

INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (21, 200, -50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (22, 200, -50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (23, 200, 50.00);

INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (31, 300, -50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (32, 300, 50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (33, 300, -50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (34, 300, 50.00);

INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (41, 400, 50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (42, 400, -50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (43, 400, 50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (44, 400, -50.00);
INSERT INTO @T (SysInvNum, REF1, LineBalance) VALUES (45, 400, 50.00);

我又添加了一些有多个错误的案例。

行数和计数

SELECT
    SysInvNum
    , REF1
    , LineBalance
    , ROW_NUMBER() OVER(PARTITION BY REF1, LineBalance ORDER BY SysInvNum) AS rn
    , COUNT(*) OVER(PARTITION BY REF1, ABS(LineBalance)) AS cc1
FROM @T AS TT

这是结果集:

SysInvNum    REF1    LineBalance    rn    cc1
11           100      50.00         1     3
12           100     -50.00         1     3
13           100      50.00         2     3
21           200     -50.00         1     3
23           200      50.00         1     3
22           200     -50.00         2     3
31           300     -50.00         1     4
32           300      50.00         1     4
33           300     -50.00         2     4
34           300      50.00         2     4
41           400      50.00         1     5
42           400     -50.00         1     5
43           400      50.00         2     5
44           400     -50.00         2     5
45           400      50.00         3     5
3341758      14598    73.19         1     2
3344296      14598   -73.19         1     2
3344298      14598   281.47         1     1
3344297      14602   -95.98         1     1
3344299      14602   558.83         1     1

您可以看到那些有错误的行的计数 > 1。此外,成对的错误具有相同的行号。因此,我们需要删除/隐藏那些 count > 1 的行以及那些具有两个相同行号的行。

确定要删除的行

WITH
CTE_rn
AS
(
    SELECT
        SysInvNum
        , REF1
        , LineBalance
        , ROW_NUMBER() OVER(PARTITION BY REF1, LineBalance ORDER BY SysInvNum) AS rn
        , COUNT(*) OVER(PARTITION BY REF1, ABS(LineBalance)) AS cc1
    FROM @T AS TT
)
, CTE_ToRemove
AS
(
    SELECT
        SysInvNum
        , REF1
        , LineBalance
        , COUNT(*) OVER(PARTITION BY REF1, rn) AS cc2
    FROM CTE_rn
    WHERE CTE_rn.cc1 > 1
)
SELECT *
FROM CTE_ToRemove
WHERE CTE_ToRemove.cc2 = 2

这是另一个中间结果:

SysInvNum    REF1    LineBalance    cc2
12           100     -50.00         2
11           100      50.00         2
21           200     -50.00         2
23           200      50.00         2
32           300      50.00         2
31           300     -50.00         2
33           300     -50.00         2
34           300      50.00         2
42           400     -50.00         2
41           400      50.00         2
43           400      50.00         2
44           400     -50.00         2
3344296      14598   -73.19         2
3341758      14598    73.19         2

现在,我们把所有这些放在一起。

最终查询

WITH
CTE_rn
AS
(
    SELECT
        SysInvNum
        , REF1
        , LineBalance
        , ROW_NUMBER() OVER(PARTITION BY REF1, LineBalance ORDER BY SysInvNum) AS rn
        , COUNT(*) OVER(PARTITION BY REF1, ABS(LineBalance)) AS cc1
    FROM @T AS TT
)
, CTE_ToRemove
AS
(
    SELECT
        SysInvNum
        , REF1
        , LineBalance
        , COUNT(*) OVER(PARTITION BY REF1, rn) AS cc2
    FROM CTE_rn
    WHERE CTE_rn.cc1 > 1
)
SELECT *
FROM @T AS TT
WHERE
    TT.SysInvNum NOT IN 
    (
        SELECT CTE_ToRemove.SysInvNum
        FROM CTE_ToRemove
        WHERE CTE_ToRemove.cc2 = 2
    )
ORDER BY SysInvNum;

Result:

SysInvNum    REF1    LineBalance
13           100       50.00
22           200      -50.00
45           400       50.00
3344297      14602    -95.98
3344298      14598    281.47
3344299      14602    558.83

请注意,最终结果没有任何 REF = 300 的行,因为有两个已更正的错误,完全相互平衡。

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

删除给定键总和为零的行 的相关文章

  • WinForms 应用程序设计 - 将文档从 SQL Server 移动到文件存储

    我有一个连接到 SQL Server 的标准 WinForms 应用程序 该应用程序允许用户上传当前存储在数据库中的文档 在使用图像列的表中 我需要更改这种方法 以便将文档存储为文件 并将文件的链接存储在数据库表中 使用当前的方法 当用户上
  • SQL统计高于和低于平均分的学生人数

    我在下面有一个示例表 我试图获取高于平均分数的学生人数和低于平均分数的学生人数 name subject classroom classarm session first term score first term grade std1 m
  • 需要 SQL Server 查询帮助

    我在视图中存储一堆数据 将 MS Access 查询转换为视图 现在我想做的是编写一个存储过程来根据添加数据的时间提取数据 这是我正在运行的查询 Select Name PlanID ApptDate 1stAppt rn from Sel
  • SQL 检查一组日期是否在指定的日期范围内

    我有一个表 其中保存架构中房间不可用的日期 ROOM ID DATE UNAVAILABLE 我需要一个 sql 查询来检查两个日期范围内是否有可用房间 类似于 Select All rooms that are constantly av
  • 一个存储过程创建的临时表可以在另一个存储过程中使用吗?

    我有一个存储过程 它使用找到的索引创建一个临时表CONTAINSTABLE就像 我放了一段存储过程代码 CREATE TABLE tmpTable ID INT RANK INT SELECT query SELECT DISTINCT I
  • SQL 多次更新与单次更新性能

    假设我有 10 000 行需要更新 什么会更快 UPDATE DB Servers SET Live 1 where name server1 UPDATE DB Servers SET Live 1 where name server2
  • 如何处理用户界面中的数据库约束违规?

    我们使用存储过程在数据库中实现大部分业务规则 我永远无法决定如何最好地将数据约束违规错误从数据库传递回用户界面 我所说的约束更多地与业务规则相关 而不是与数据完整性相关 例如 诸如 无法插入重复的键行 之类的数据库错误与业务规则 不能有多个
  • SQL Server 将一个表中的所有行复制到另一个表中,即重复表

    我想保留一张桌子作为历史并用空桌子替换它 我如何通过 Management Studio 执行此操作 将您的表复制到要存档的表中 SELECT INTO ArchiveTable FROM MyTable 删除表中的所有条目 DELETE
  • MYSQL 查询返回“资源 id#12”而不是它应返回的数值

    不知道为什么 但这返回了错误的值 我正在取回此资源 ID 12 而不是我正在寻找的数值 1 执行此操作的代码是 type SELECT account type from user attribs WHERE username userna
  • 使用 SQL Filestream 时出现 OutOfMemoryException

    我正在尝试将大约 600 MB 的 zip 文件上传到 SQL 2008 FILESTREAM 表 但出现 OutOfMemoryException 我正在使用 SqlFileStream 类上传文件 如本教程中所述 http www ag
  • ClassCastException:java.util.Date 无法转换为 java.sql.Date

    你好 我的代码抛出了ClassCastException StackTrace 显示 java lang ClassCastException java util Date cannot be cast to java sql Date a
  • SQL Server freetexttable 部分单词

    我第一次使用 SQL 自由文本搜索 我有点困惑为什么它会这样 我有一个联系人表 用户可以搜索并且我正在使用 SELECT Contacts Rank FROM FREETEXTTABLE Contacts O Roarty AS Conta
  • 从表中删除孤儿

    我正在尝试清理一张有很多孤立项目的桌子 我通过查找空值来检查是否与另一个表存在关系来解决此问题 DELETE FROM table1 LEFT JOIN table2 ON table1 ID table2 ID WHERE table2
  • 将两行中相似的列数据合并到一行中

    我的查询结果具有以下特征 LIDCode Total Domain Region VSE Version AB02 15 GLOBAL CANLA 0 6943 AB02 5925 CENTRE STREET SW 31 GLOBAL CA
  • 使用 Switch 的报告服务表达式

    我无法让这个表达式与报告服务一起使用 我必须使用 IF 和 ELSE IF 语句 感谢您的任何建议 Switch IsNothing Fields field date Value Fields set flag Value 1 Decli
  • 如何查找 PostgreSQL 数据库的上次更新时间?

    我正在使用一个批量更新的 postgreSQL 数据库 我需要知道数据库 或数据库中的表 上次更新或修改的时间 两者都可以 我看到 postgreSQL 论坛上有人建议使用日志记录并查询日志 这对我不起作用 因为我无法控制客户端代码库 你可
  • 插入多行并返回主键时 Sqlalchemy 的奇怪行为

    插入多行并返回主键时 我注意到一些奇怪的事情 如果我在 isert 查询中添加使用参数值 我会得到预期的行为 但是当将值传递给游标时 不会返回任何内容 这可能是一个错误还是我误解了什么 我的sqlachemy版本是0 9 4 下面如何重现错
  • 将大量实体插入 SQL Server 2012 [重复]

    这个问题在这里已经有答案了 我正在进行一个使用 Entity Framework 5 和 SQL Server 2012 的项目 我们需要一次插入大量行 100k 个实体的顺序 基本上 我们有一个物理程序 它输出大量二进制数据 然后我们需要
  • 限制 SQL Server 连接到特定 IP 地址

    我想将 SQL Server 实例的连接限制为特定 IP 地址 我想阻止来自除特定列表之外的任何 IP 地址的任何连接 这是可以在 SQL Server 实例或数据库中配置的东西吗 听起来像是你会使用Windows防火墙 http tech
  • 如何在SSRS中的表上创建热图?

    如何在 SSRS 中创建这样的内容 颜色将根据行中的值 承销商 从红色变为绿色 所有这些都在一个组中 您可以通过右键单击各个单元格并根据表达式设置填充颜色来完成此操作 In the Image below I ve mistakingly

随机推荐

  • go float 零除编译器错误

    这种行为有何意义 只打印编译器警告而不是错误不是更有意义吗 func main var y float64 0 0 var x float64 4 0 y fmt Println x Inf func main var x float64
  • 如何仅更改 javafx css 中的左填充

    我经常使用 html css 但我对 javafx css 完全陌生 所以这将是一个新手问题 但我在任何地方都找不到答案 我有一个充满标签的大网格窗格 除了其他标签之外 我可以为所有这些标签设置填充 例如 GridPane containe
  • C++ 中的越界和未定义的行为

    我知道在 C 中 超出缓冲区范围的访问是未定义的行为 这是来自 cppreference 的示例 int table 4 bool exists in table int v return true in one of the first
  • 两个字符相加产生 int

    我制作了一个简单的程序并使用 GCC 4 4 4 5 编译它 如下所示 int main char u 10 char x x char i u x return 0 g c Wconversion a cpp 我有以下内容 a cpp I
  • Jackson JSON - 反序列化 Commons MultiMap

    我想使用 JSON 序列化和反序列化 MultiMap Apache Commons 4 要测试的代码段 MultiMap
  • 非常量复制构造函数和返回值的隐式转换

    考虑以下 C 代码 struct B struct A A int A A missing const is intentional A B operator B A f return A 1 compiles fine return 1
  • 粘性灵活的页脚和页眉 CSS 在 WebKit 中工作正常,但在 Gecko 中不行

    我正在尝试构建一个允许灵活高度的页眉和页脚的布局 中间的部分占用剩余空间 中间的任何溢出都应该为该中间部分提供一个滚动条 我的适用于 Safari 和 Chrome 的代码是
  • Angular:构建后是否可以读取json文件

    我正在开发一个 Angular 7 项目 该项目需要在不同的服务器上运行 我需要从环境文件中读取服务器 URL 并且无法设置为静态变量 我尝试读取 JSON 文件 但一旦我ng build该项目 它将 JSON 的内容复制为 main js
  • MVC 中 OnChange 事件的 AJAX 调用

    我必须对作为视图一部分的下拉列表的 onchange 事件进行 AJAX 调用 在更改事件中 我需要调用数据库 进行一些计算以显示 UI 然后使用计算来填充图表控件 UI 显示按此顺序 图表 下拉类别列表 带有评分的子类别列表 因此 我需要
  • 使用 phpMyAdmin 的跟踪机制迁移数据库

    在开发数据库中 我在所有表上启用了 phpMyAdmin 跟踪 它记录了我对表结构所做的所有更改 在本例中我对数据跟踪不感兴趣 到目前为止一切顺利 然后我想要做的是为所有跟踪的表取出一份报告 其中包含特定版本 或者日期甚至可以工作 所做的更
  • django - django-taggit 形式

    我想用django taggit 点击这里 文档 点击这里 谈论使用ModelForm生成表单 但我已经有了我想使用的表单 假设我有这样的事情 forms py class MyForm forms Form tags forms Char
  • 在 sizeof 操作中取消引用空指针是否有效[重复]

    这个问题在这里已经有答案了 我遇到了一段代码 对我来说应该崩溃分段故障 但它仍然可以顺利工作 有问题的代码加上相关的数据结构如下 相关注释位于上面 typedef struct double length unsigned char nPl
  • 了解 C++ 指针(当它们指向指针时)

    我想我很好地理解了参考文献和指针 这是我 认为我 所知道的 int i 5 i is a primitive type the value is 5 i do not know the address int ptr a pointer t
  • Kinect:如何从一些深度数据获取骨架数据(从kinect获取,但我修改了一些地方)

    我可以从 Kinect 获取深度帧 然后修改帧中的数据 现在我想使用修改后的深度帧来获取骨架数据 我该怎么做 好吧 我发现没有办法用 microsoft kinect sdks 来做到这一点 现在 我发现使用 OpenNI 是可以的 它是
  • 将多条编码多段线合并为一条编码多段线

    我正在尝试将新的编码多段线与现有多段线合并 而不对整个多段线进行解码和重新编码 新编码的折线将上传到 linux 服务器 我想将其附加到现有的折线 问题是 你不能把它们混在一起 下面是一些可以使用的示例数据 我希望在 PHP 或 shell
  • 如何访问受保护的数组值?

    您好 我有这个数组 我不确定如何从中获取名称 品牌 图像 令牌值 Gloudemans Shoppingcart CartCollection Object items protected gt Array 1264477c2182cc04
  • asp.net:无效的回发或回调参数

    我收到此错误 Server Error in Application Invalid postback or callback argument Event validation is enabled using
  • 将字符串从 __DATE__ 转换为 time_t

    我正在尝试转换从生成的字符串 DATE 宏变成time t 我不需要一个成熟的日期 时间解析器 它只处理 DATE 宏会很棒 预处理器方法会很漂亮 但函数也同样有效 如果相关的话 我正在使用 MSVC 编辑 更正后的函数应如下所示 time
  • 没有 id 的 JPA 实体

    我有一个具有以下结构的数据库 CREATE TABLE entity id SERIAL name VARCHAR 255 PRIMARY KEY id CREATE TABLE entity property entity id SERI
  • 删除给定键总和为零的行

    我有一个查询 该查询将导致在我们的 SSRS 2008 R2 服务器上创建客户账单 SQL Server实例也是2008 R2 查询很大 出于安全原因等原因我不想发布整个内容 我需要对下面的示例数据执行的操作是从结果集中删除带有 73 19