SQLite - 连接 2 个表,根据部分字符串匹配排除某些行
SQLite - Joining 2 tables excluding certain rows based on a partial string match
假设我有两个 tables:
Table一个
Names
Sales
Department
Dave
5
Shoes
mike
6
Apparel
Dan
7
Front End
Table B
Names
SALES
Department
Dave
5
Shoes
mike
12
Apparel
Dan
7
Front End
Gregg
23
Shoes
Kim
15
Front End
我想创建一个按名称连接 table 并按 table 分隔销售额总和的查询。我还想过滤我的查询以删除字符串匹配或在这种情况下按某些名称的部分匹配。
我要的是下面的结果
Table 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 子句似乎不适用,或者适用于错误的 table。由于 Names 列在两者之间并不完全匹配,我认为发生的情况是当它们被加入 'ON B.names = A.Names' 时,来自 B 的额外内容被排除在外?当我翻转事物时,虽然我得到了相同的结果,但没有应用过滤器。我得到的错误结果如下:
Table D:
A Sales Sum
B Sales Sum
18
62
很明显,我在这里遇到了语法问题,因为我是 SQL 的新手。我错过了什么?谢谢!
我想你想要一个联合方法:
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 表明上面的查询有效。
您不需要 table 的连接或并集,您不应该这样做。
分别聚合每个 table 和 return 具有 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
假设我有两个 tables:
Table一个
Names | Sales | Department |
---|---|---|
Dave | 5 | Shoes |
mike | 6 | Apparel |
Dan | 7 | Front End |
Table B
Names | SALES | Department |
---|---|---|
Dave | 5 | Shoes |
mike | 12 | Apparel |
Dan | 7 | Front End |
Gregg | 23 | Shoes |
Kim | 15 | Front End |
我想创建一个按名称连接 table 并按 table 分隔销售额总和的查询。我还想过滤我的查询以删除字符串匹配或在这种情况下按某些名称的部分匹配。
我要的是下面的结果
Table 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 子句似乎不适用,或者适用于错误的 table。由于 Names 列在两者之间并不完全匹配,我认为发生的情况是当它们被加入 'ON B.names = A.Names' 时,来自 B 的额外内容被排除在外?当我翻转事物时,虽然我得到了相同的结果,但没有应用过滤器。我得到的错误结果如下:
Table D:
A Sales Sum | B Sales Sum |
---|---|
18 | 62 |
很明显,我在这里遇到了语法问题,因为我是 SQL 的新手。我错过了什么?谢谢!
我想你想要一个联合方法:
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 表明上面的查询有效。
您不需要 table 的连接或并集,您不应该这样做。
分别聚合每个 table 和 return 具有 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