Select 创建多字段行以显示列表中缺少的项目
Select to create multi-field row showing items missing from list
这听起来与其他问题类似,但我已尝试(未成功)调整它们...Oracle 数据库,如果这很重要的话。
我们的销售人员被分配了 NORTH
、EAST
、SOUTH
或 WEST
区域(1、2、3 或全部 4)的任意组合。我想创建一个 table 来显示缺少的内容。所以,table sales_regions
成立:
SELECT user, region, current
FROM sales_regions
WHERE region IN ('NORTH','EAST','SOUTH','WEST');
USER REGION CURRENT
---- -
U1 EAST Y
U1 SOUTH Y
U2 NORTH Y
U3 NORTH Y
U3 EAST Y
U3 SOUTH Y
U3 WEST Y
我正在尝试提出一个查询,该查询将生成一个列表,当与现有列表结合使用时,将为每个销售人员提供每个区域:
USER REGION CURRENT
U1 WEST N
U1 NORTH N
U2 EAST N
U2 SOUTH N
U2 WEST N
旧的 post,只包含 1 个字段,有解决方案:
SELECT v.fruit FROM (
SELECT 'apple' AS fruit
UNION ALL
SELECT 'banana'
UNION ALL
SELECT 'carrot') v
LEFT JOIN friuttable ft ON ft.fruit = v.fruit
WHERE ft.fruit IS NULL
这看起来很接近 - 但我无法使多字段查询工作...
您可以创建一个结果集来保存不同销售人员和地区的每个组合:
SELECT t1.user, t2.region
FROM (SELECT DISTINCT user FROM sales_region) t1
,(SELECT DISTINCT region FROM sales_region) t2;
然后您可以使用集合运算符 MINUS
来获得此 table 和您的 table:
之间的区别
SELECT t1.user, t2.region
FROM (SELECT DISTINCT user FROM sales_region) t1
,(SELECT DISTINCT region FROM sales_region) t2
MINUS
SELECT user, region
FROM sales_region;
那应该吐出一个 table,它只有 user
/region
组合,而这些组合在您的 sales_region
table 中并不存在。
试试这个:
WITH sales_regions AS (
SELECT 'U1' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U1' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U2' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'WEST' AS region, 'Y' AS CURRENT_ from dual ),
users AS (
SELECT 'U1' AS username FROM dual UNION ALL
SELECT 'U2' AS username FROM dual UNION ALL
SELECT 'U3' AS username FROM dual),
regions AS (
SELECT 'EAST' AS region FROM dual UNION ALL
SELECT 'SOUTH' AS region FROM dual UNION ALL
SELECT 'NORTH' AS region FROM dual UNION ALL
SELECT 'WEST' AS region FROM dual
)
SELECT u.username, r.region, 'N' AS current_
FROM users u JOIN regions r ON 1=1
LEFT JOIN sales_regions sr ON u.username = sr.username AND r.region = sr.region
WHERE sr.username IS NULL
或减号运算符,如果记录是唯一的或不是,但您希望它们是:
WITH sales_regions AS (
SELECT 'U1' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U1' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U2' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'WEST' AS region, 'Y' AS CURRENT_ from dual ),
users AS (
SELECT 'U1' AS username FROM dual UNION ALL
SELECT 'U2' AS username FROM dual UNION ALL
SELECT 'U3' AS username FROM dual),
regions AS (
SELECT 'EAST' AS region FROM dual UNION ALL
SELECT 'SOUTH' AS region FROM dual UNION ALL
SELECT 'NORTH' AS region FROM dual UNION ALL
SELECT 'WEST' AS region FROM dual
)
SELECT username, region, 'N' AS current_
FROM (
SELECT u.username, r.region
FROM users u JOIN regions r ON 1=1
MINUS
SELECT sr.username, sr.region
FROM sales_regions sr ) t
希望对您有所帮助!
PS: 请避免使用关键字作为对象或列名!
这听起来与其他问题类似,但我已尝试(未成功)调整它们...Oracle 数据库,如果这很重要的话。
我们的销售人员被分配了 NORTH
、EAST
、SOUTH
或 WEST
区域(1、2、3 或全部 4)的任意组合。我想创建一个 table 来显示缺少的内容。所以,table sales_regions
成立:
SELECT user, region, current
FROM sales_regions
WHERE region IN ('NORTH','EAST','SOUTH','WEST');
USER REGION CURRENT
---- -
U1 EAST Y
U1 SOUTH Y
U2 NORTH Y
U3 NORTH Y
U3 EAST Y
U3 SOUTH Y
U3 WEST Y
我正在尝试提出一个查询,该查询将生成一个列表,当与现有列表结合使用时,将为每个销售人员提供每个区域:
USER REGION CURRENT
U1 WEST N
U1 NORTH N
U2 EAST N
U2 SOUTH N
U2 WEST N
旧的 post,只包含 1 个字段,有解决方案:
SELECT v.fruit FROM (
SELECT 'apple' AS fruit
UNION ALL
SELECT 'banana'
UNION ALL
SELECT 'carrot') v
LEFT JOIN friuttable ft ON ft.fruit = v.fruit
WHERE ft.fruit IS NULL
这看起来很接近 - 但我无法使多字段查询工作...
您可以创建一个结果集来保存不同销售人员和地区的每个组合:
SELECT t1.user, t2.region
FROM (SELECT DISTINCT user FROM sales_region) t1
,(SELECT DISTINCT region FROM sales_region) t2;
然后您可以使用集合运算符 MINUS
来获得此 table 和您的 table:
SELECT t1.user, t2.region
FROM (SELECT DISTINCT user FROM sales_region) t1
,(SELECT DISTINCT region FROM sales_region) t2
MINUS
SELECT user, region
FROM sales_region;
那应该吐出一个 table,它只有 user
/region
组合,而这些组合在您的 sales_region
table 中并不存在。
试试这个:
WITH sales_regions AS (
SELECT 'U1' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U1' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U2' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'WEST' AS region, 'Y' AS CURRENT_ from dual ),
users AS (
SELECT 'U1' AS username FROM dual UNION ALL
SELECT 'U2' AS username FROM dual UNION ALL
SELECT 'U3' AS username FROM dual),
regions AS (
SELECT 'EAST' AS region FROM dual UNION ALL
SELECT 'SOUTH' AS region FROM dual UNION ALL
SELECT 'NORTH' AS region FROM dual UNION ALL
SELECT 'WEST' AS region FROM dual
)
SELECT u.username, r.region, 'N' AS current_
FROM users u JOIN regions r ON 1=1
LEFT JOIN sales_regions sr ON u.username = sr.username AND r.region = sr.region
WHERE sr.username IS NULL
或减号运算符,如果记录是唯一的或不是,但您希望它们是:
WITH sales_regions AS (
SELECT 'U1' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U1' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U2' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'EAST' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'SOUTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'NORTH' AS region, 'Y' AS CURRENT_ from dual UNION ALL
SELECT 'U3' AS username, 'WEST' AS region, 'Y' AS CURRENT_ from dual ),
users AS (
SELECT 'U1' AS username FROM dual UNION ALL
SELECT 'U2' AS username FROM dual UNION ALL
SELECT 'U3' AS username FROM dual),
regions AS (
SELECT 'EAST' AS region FROM dual UNION ALL
SELECT 'SOUTH' AS region FROM dual UNION ALL
SELECT 'NORTH' AS region FROM dual UNION ALL
SELECT 'WEST' AS region FROM dual
)
SELECT username, region, 'N' AS current_
FROM (
SELECT u.username, r.region
FROM users u JOIN regions r ON 1=1
MINUS
SELECT sr.username, sr.region
FROM sales_regions sr ) t
希望对您有所帮助!
PS: 请避免使用关键字作为对象或列名!