【问题标题】:How to filter rows by equal values in different columns for groups in SQL如何通过SQL中组的不同列中的相等值过滤行
【发布时间】:2022-02-02 17:01:03
【问题描述】:

当我在同一家公司的 Cred 和 Debt 值相同时,我正在苦苦思考如何过滤我的表。它们需要相同,如下面的玩具示例。

假设如下表

+---------+----------+----------+----------+
| Company | Cred     | Debt     | ID       |
+---------+----------+----------+----------+
| BFG     |       10 |         0|         1|
| AAA     |       11 |         0|         2|
| CCC     |        6 |         0|         3|
| BFG     |        0 |        13|         4|
| AAA     |        0 |        11|         5|
| CCC     |        0 |         7|         6|
| CCC     |        0 |         6|         7|
+---------+----------+----------+----------+


-- Desired result, as something like
+---------+----------+----------+----------+
| Company | Cred     | Debt     | ID       |
+---------+----------+----------+----------+
| AAA     |       11 |         0|         2|
| CCC     |        6 |         0|         3|
| AAA     |        0 |        11|         5|
| CCC     |        0 |         6|         7|
+---------+----------+----------+----------+

我想使用它们的总和并在列中过滤具有相等值的总计,按总计和公司分组,但这种策略不起作用,因为公司可以在不同行的借方列中具有相同的值。

任何提示我该怎么做?

【问题讨论】:

  • 过于简化,很容易误入歧途。如果存在 行,您会期望什么?毕竟 - 对于完全不同的交易,贷方或借方的金额可以很容易地并且经常随着时间的推移而重复。
  • @SMor,在这种情况下,这些行也必须考虑。
  • 这似乎很明显。将其添加到您的示例数据中,然后添加您想要的输出,然后解释您认为可用于进行匹配的逻辑。我担心您过度简化了您的样本数据,并且可能忽略了包括贷方和借方在内的分类帐交易的复杂性(请注意我的假设 - 也许这根本不是分类帐信息)。人们经常会看到给定交易的多笔贷记和多笔借记 - 这意味着您无法匹配单个金额(即您匹配总金额)。

标签: sql sql-server filter group-by


【解决方案1】:

你可以使用EXISTS:

SELECT t1.*
FROM tablename t1
WHERE EXISTS (
  SELECT 1
  FROM tablename t2
  WHERE t2.Company = t1.Company AND t2.ID <> t1.ID
    AND t2.Cred = t1.Debt AND t2.Debt = t1.Cred
);

如果CredDebt 在同一行中始终不同,则可以删除条件AND t2.ID &lt;&gt; t1.ID

【讨论】:

    【解决方案2】:
    select a.* 
    from sometable a, sometable b
    where a.id <> b.id
    and a.company=b.company
    and a.credit=b.debt
    and a.debt = b.credit;
    

    【讨论】:

      【解决方案3】:

      使用 select company comp, credit cred , Id credit_id from tablename 作为信用 选择公司、借方、信用、贷方id、借方id 从 company = comp 上的信用连接表名 其中信用 = 借记

      如果匹配项太多,您将遇到问题,因为行数将是匹配项数的乘积

      【讨论】:

      • 你的代码甚至没有运行。
      • 我知道 - 我什至没有表名。提问者需要准备好自己做一些工作。
      • 如果你想提供有效的代码作为答案,你还需要做很多工作。您查询的问题不仅在于表的名称。
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多