【问题标题】:SQLite - Joining 2 tables excluding certain rows based on a partial string matchSQLite - 基于部分字符串匹配加入 2 个不包括某些行的表
【发布时间】:2023-03-24 16:43:01
【问题描述】:

假设我有两张桌子:

表 A

Names Sales Department
Dave 5 Shoes
mike 6 Apparel
Dan 7 Front End

表 B

Names SALES Department
Dave 5 Shoes
mike 12 Apparel
Dan 7 Front End
Gregg 23 Shoes
Kim 15 Front End

我想创建一个按名称连接表并按表分隔销售额总和的查询。我还想过滤我的查询以在这种情况下通过某些名称删除字符串匹配或部分匹配。

我想要的是下面的结果

表 C:

A Sales Sum B Sales Sum
18 24

我知道我可以通过如下查询来做到这一点:

SELECT SUM(A.sales) AS 'A Sales Sum', SUM(B.sales) AS 'B sales Sum' FROM A
JOIN B
ON B.names = A.Names
WHERE Names NOT LIKE '%Gregg%' OR NOT LIKE '%Kim%'

这个问题是 WHERE 子句似乎不适用,或者适用于错误的表。由于 Names 列在两者之间不完全匹配,我认为发生的情况是当它们加入“ON B.names = A.Names”时,B 的额外内容被排除在外了吗?当我翻转东西时,虽然我得到了相同的结果,但没有应用过滤器。我得到的错误结果如下:

表 D:

A Sales Sum B Sales Sum
18 62

很明显,我在这里遇到了语法问题,因为我对 SQL 还很陌生。我错过了什么?谢谢!

【问题讨论】:

  • 您的查询不会按书面形式编译。
  • 您没有明确说明要保留或删除哪些行。所以我们不知道什么代码是正确的。如果你没有清楚地表达自己,你怎么知道? (修辞。)PS minimal reproducible example How to Ask
  • 我确实展示了我试图获取我想要的列的查询示例以及包含我想要的结果的示例表
  • 就像我说的,“你没有说清楚”。就像我说的,“如果你没有清楚地表达自己,你怎么知道?”你希望我们能从那个例子中猜到。而且我们无法剪切、粘贴和运行该示例。
  • 我用斜体字表示“我想要的是以下结果”然后显示结果并显示我试图编写的查询作为我的最佳尝试,清楚地表明我想要表 A 和 B 的销售额总和在名称列上使用过滤器。再说一次,我真的不明白我怎么能更具体......

标签: sqlite sum left-join where-clause sql-like


【解决方案1】:

您不需要表的联接或联合,也不应该这样做。
分别在每个表中聚合并返回带有 2 个子查询的结果:

SELECT 
  (SELECT SUM(Sales) FROM A WHERE Names NOT LIKE '%Gregg%' AND Names NOT LIKE '%Kim%') ASalesSum,
  (SELECT SUM(Sales) FROM B WHERE Names NOT LIKE '%Gregg%' AND Names NOT LIKE '%Kim%') BSalesSum

【讨论】:

  • 有没有办法使用这样的子查询来添加多行?假设我为每个部门都有单独的销售数据表,并且我希望查询中的每一行都是不同的标签部门,我可以使用您在此处提供的格式来做类似的事情吗?
  • @carlb710 每个子查询仅返回 1 行和 1 列。如果你想要超过 1 行,你应该使用超过 1 个查询,比如上面的查询与 UNION 相结合,但也许这不是做你想做的最好的方法。最好发布一个新问题,用示例数据和预期结果解释您想要什么。
【解决方案2】:

我认为您希望在这里采用联合方法:

SELECT
    SUM(CASE WHEN src = 'A' THEN sales ELSE 0 END) AS "A Sales Sum",
    SUM(CASE WHEN src = 'B' THEN sales ELSE 0 END) AS "B Sales Sum"
FROM
(
    SELECT sales, 'A' AS src FROM A WHERE Names NOT IN ('Gregg', 'Kim')
    UNION ALL
    SELECT sales, 'B' FROM B WHERE Names NOT IN ('Gregg', 'Kim')

) t;

这是一个demo,表明上述查询正在运行。

【讨论】:

  • 感谢您花时间阅读我的问题并在急于说它不完整之前给出答案。有用的建议!
  • 这适用于部分字符串匹配吗?假设我正在过滤不是名称中包含多个单词的字符串。我可以只使用 NOT IN LIKE ('%a word%') 吗?
猜你喜欢
  • 2021-12-22
  • 2022-10-19
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
相关资源
最近更新 更多