带有大小写的Oracle SQL查询垂直到水平[重复]
Posted
技术标签:
【中文标题】带有大小写的Oracle SQL查询垂直到水平[重复]【英文标题】:Oracle SQL Query Vertical to Horizontal with case [duplicate] 【发布时间】:2016-12-20 18:43:14 【问题描述】:我的用户表有两列用户和组,一个用户可以有多个组
User | Group
--------------
User1 | Group1
User1 | Group2
User2 | Group1
User2 | Group2
User3 | Group1
User4 | Group2
我正在尝试编写 sql 以将上面的表格数据转换为以下格式。
User | Group1 | Group2
---------------------------------
User1 | Yes | Yes
User2 | Yes | Yes
User3 | Yes | No
User4 | No | Yes
需要帮助。 谢谢
【问题讨论】:
您是否尝试过编写查询以获得结果?您应该尝试编辑问题。 @krokodilko 是的,谢谢 【参考方案1】:我认为您可以使用 CASE 和分组来做到这一点:
SELECT user,
CASE WHEN MIN(`group`) = 'Group1' THEN 'Yes' ELSE 'No' END AS Group1,
CASE WHEN MAX(`group`) = 'Group2' THEN 'Yes' ELSE 'No' END AS Group2
FROM t
GROUP BY user
【讨论】:
示例中未包含该内容。可能值得对 OP 提出后续问题,而不是对答案投反对票...【参考方案2】:with
test_data ( usr , grp ) as (
select 'User1', 'Group1' from dual union all
select 'User1', 'Group2' from dual union all
select 'User2', 'Group1' from dual union all
select 'User2', 'Group2' from dual union all
select 'User3', 'Group1' from dual union all
select 'User4', 'Group2' from dual
)
-- end of test data; the query begins below this line
select usr,
case when count(case when grp = 'Group1' then 1 end) > 0
then 'Yes' else 'No' end as grp1,
case when count(case when grp = 'Group2' then 1 end) > 0
then 'Yes' else 'No' end as grp2
from test_data
group by usr
order by usr -- order by is optional
;
USR GRP1 GRP2
----- ---- ----
User1 Yes Yes
User2 Yes Yes
User3 Yes No
User4 No Yes
【讨论】:
【参考方案3】:试试这个:
select usr,
max(case when grp = 'Group1' then 'Yes' else 'No' end) grp1,
max(case when grp = 'Group2' then 'Yes' else 'No' end) grp2
from table
group by usr;
P.S.:避免在表格中使用像 USER
这样的关键字。
【讨论】:
这不完全满足要求 - 当找不到该用户的组时,OP 的所需输出显示'No'
而不是 NULL
。以上是关于带有大小写的Oracle SQL查询垂直到水平[重复]的主要内容,如果未能解决你的问题,请参考以下文章