SQL - 为给定列中的值获取另一列的值

Ran_Macavity

我正在处理一个大型数据表。如果给定项目的目的地超过 1 个,我想检查各个项目的目的地和目的地的数量。

所以在下图中,在我的结果中,我不应该得到 Items Grapes 和 Rice,因为它们只有一个目的地。但我应该得到 Apple 和 Orange 项的结果。

在此处输入图片说明

我写的查询如下。然而,它并不能达到目的。

SELECT PrdTbl.Item,,PrdTbl2.cnt
FROM ProductsTable PrdTbl
JOIN
(
SELECT Item,count(*) cnt FROM ProductsTable
GROUP BY Item
HAVING COUNT(*) > 1
) PrdTbl2 ON PrdTbl.Item = PrdTbl2.Item
ORDER BY PrdTbl.Item;

有人可以提出解决方案吗?提前致谢。

编辑 :

感谢您的原始答案。

我认为我的问题需要重新表述。我也想按目的地过滤。虽然原始状态保持不变,但我需要删除前往同一目的地的物品。所以在这里,只有 Apple 及其各自的目的地是我需要的。橙色应该被删除,因为它去同一个目的地。

在此处输入图片说明

亚历克斯·普尔

正如@forpas 所说,如果您修复了选择列表,那么您的查询将执行您所说的操作:

SELECT PrdTbl.Item,PrdTbl.Destination,PrdTbl2.cnt
FROM ...

您还可以使用分析计数来避免自联接:

SELECT Item, Destination, cnt
FROM (
  SELECT Item, Destination, count(*) OVER (PARTITION BY Item) as cnt
  FROM ProductsTable
)
WHERE cnt > 1
ORDER BY Item;

ITEM   | DESTINATION | CNT
:----- | :---------- | --:
Apple  | Paris       |   3
Apple  | Rome        |   3
Apple  | London      |   3
Orange | Cape Town   |   3
Orange | New York    |   3
Orange | Cairo       |   3

数据库<>小提琴

我也想按目的地过滤。虽然原始状态保持不变,但我需要删除前往同一目的地的物品。

您只需要计算不同的目的地,而不是所有行:

SELECT PrdTbl.Item,PrdTbl.Destination,PrdTbl2.cnt
FROM ProductsTable PrdTbl
JOIN
(
SELECT Item,count(DISTINCT Destination) cnt FROM ProductsTable
GROUP BY Item
HAVING COUNT(DISTINCT Destination) > 1
) PrdTbl2 ON PrdTbl.Item = PrdTbl2.Item
ORDER BY PrdTbl.Item;

或使用分析:

SELECT Item, Destination, cnt
FROM (
  SELECT Item, Destination, count(DISTINCT Destination) OVER (PARTITION BY Item) as cnt
  FROM ProductsTable
)
WHERE cnt > 1
ORDER BY Item;

ITEM  | DESTINATION | CNT
:---- | :---------- | --:
Apple | Barcelona   |   5
Apple | London      |   5
Apple | Moscow      |   5
Apple | Paris       |   5
Apple | Rome        |   5

数据库<>小提琴

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQL / Postgres:查找具有相同值的元组(对于另一列中的给定值)

Spark SQL:当另一列是 groupBy().agg() 中的最大值时获取列的值

SQL查询以获取另一列中每个唯一值的最大值

SQL 获取一列的值,使得另一列中的某个值不存在

SQL:为另一列选择不同的值

如果另一列在SQL Server中相同,则获取具有最小列值的行

SQL根据另一列中的值从一列中选择值

sql-对于列样本中的每个唯一值,从另一列获取2个不同的值

SQL:如何根据SQL中另一列中的值范围对一列求和?

根据 SQL 中的另一列过滤值

如何在基于另一列的一列中累积SQL中的值?

SQL筛选一列中的所有值,但不在另一列中

从SQL查询在一列中获取多个值

如何根据SQL中另一列的值过滤一列

SQL:一列中与另一列相关的值计数

一列的默认值可以是SQL中的另一列吗?

SQL - 计算一个列值在另一列值中的出现次数

SQL选择与另一列中的多个值匹配的列的值?

Oracle Sql获取针对另一列的每个不同值显示最多的值

SQL:为另一列的唯一条目平均一列的值

SQL-根据选择行之间另一列的平均值获取列值

SQL如何基于另一列中的值在一行中多次选择列

SQL为单独列的每个唯一值将列设置为等于上个月的另一列

查询SQL表以根据另一列中的过滤器获取一列中的所有新值

用用户输入减去从sql中获取的值,并将其输出到另一列中

SQL 数据库 - 为另一表列取一列最大值

为另一列中的每个值产生相等长度的行(使用Python或SQL)

检查条件是否为真,如果是,则将值添加到 sql 中的另一列

如何插入基于另一列(SQL)中的值设置唯一ID的列?