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

Posted

技术标签:

【中文标题】SQL - 为给定列中的值获取另一列的值【英文标题】:SQL - Get the values of another column for values in a given column 【发布时间】:2021-02-16 10:01:05 【问题描述】:

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

所以在下图中,在我的结果中,我不应该得到葡萄和大米,因为它们只有一个目的地。但我应该得到项目 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;

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

编辑:

感谢您的原始答案。

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

【问题讨论】:

SELECT PrdTbl.Item,PrdTbl.Destination,PrdTbl2.cnt ... 并且您的查询应该可以工作。 谢谢...但我忘了提及我的第二个条件..我编辑了我的问题。你能帮忙吗? 【参考方案1】:

正如@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

db<>fiddle

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

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

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

db<>fiddle

【讨论】:

非常感谢。这就是我需要的:)【参考方案2】:

如果你只需要查看项目,则无需加入,你可以直接说

select item, count(1) 
  from ek_test
 group by item
having count(1) > 1;

这将显示超过 1 条记录的项目

【讨论】:

以上是关于SQL - 为给定列中的值获取另一列的值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一列的值获取单行值?

获取 ant.design 表列中另一列的值?

SQL Server:选择一列的计数,同时检查另一列中的不同值

根据另一列中的值从一列中减去值(SQL)

用于计算同一列的值百分比的 SQL [关闭]

SQL数据库中 如何让某一列的值自动累加1?