如何检索不同的列数据

时间:2017-11-17 12:20:04

标签: sql oracle

我需要检索具有不同值的数据列

对于Ex:

Location FoodType Gender Alive
India    Veg      M      Y
India    NonVeg   M      N

我需要一个查询来列出具有不同值的数据行 预期产出是:

FoodType Alive
Veg      Y
NonVeg   N

不同唯一可能无效,因为我不知道哪个列会有不同的值。

2 个答案:

答案 0 :(得分:1)

如果您需要列表,则可以使用unpivot,计算不同的值,并可选地将它们与listagg()一起聚合:

with t(Location, FoodType, Gender, Alive) as (
    select 'India', 'Veg',    'M', 'Y' from dual union all
    select 'India', 'NonVeg', 'M', 'N' from dual )

-- end of test data, the exact query starts here:

select col, listagg(val, ', ') within group (order by val) list
  from (
    select col, val, count(distinct val) over (partition by col) cnt
      from t
      unpivot (val for col in (Location, FoodType, Gender, Alive)))
  where cnt > 1
  group by col

我们有:

COL       LIST
--------  -------------
ALIVE     N, Y
FOODTYPE  NonVeg, Veg

如果您坚持在单独的列中输出您需要动态SQL再次生成到pivot数据的非不同列的列表。

如果表格中有空值且非空,并且您想要显示此类对,请使用include nullsnvl()进行展开。

答案 1 :(得分:0)

评论太长了。

SQL查询具有一组固定的列。您不能指定具有变量编号的查询 - 尽管您可以使用动态SQL执行此操作。

您可以在列中获取不同值的列表:

select count(distinct Location),
       count(distinct FoodType),
       count(distinct Gender),
       count(distinct Alive)
from t;

但是,这并不会返回列中的值。