我尝试创建查询以获取区域数据,以准备将列移动到另一个表。我们的数据库如何设置是我们有资产和电缆。一个资产可以有很多电缆,但是电缆不能有多个资产。我们目前正在尝试将“区域”字段从“有线”表格(例如下方)移动到“资产”表格。
A_ID C_ID Zone
--------------------------
1 1 Green
1 2 Green
1 3 Yellow
2 4 Green
2 5 Red
3 6 Yellow
3 7 Yellow
3 8 Yellow
3 9 Red
我希望为资产表设置它的方式是,如果资产包含多个具有不同区域的电缆,如果其中一个区域为黄色,则默认为黄色(例如3条绿色电缆,1条黄色电缆 - Asset_ID有黄区)。接下来,如果它没有任何黄色但至少有1个红色,则默认为红色(例如2条绿色电缆,3条红色电缆 - Asset_ID具有红色区域)。只有它只有绿色区域时才默认为绿色。
使用上面的样本表是我期望的结果。
Expected Results
A_ID Zone
-------------
1 Yellow
2 Red
3 Yellow
我尝试使用CASE语句,但我在制定查询时遇到了问题,无法正确分组结果。
非常感谢任何帮助,谢谢你。
答案 0 :(得分:0)
无需案例或需要陈述。集思考。您需要为优先级分配优先级连接,并首先选择优先级最高的连接。喜欢这个
WITH Priority AS
(
SELECT * FROM (
VALUES
('Yellow', 1),
('Red', 2),
('Green', 3)
) AS P(Zone,P)
)
SELECT A_ID, Zone
FROM (
SELECT A_ID, Zone
ROW_NUMBER() OVER (PARTITION BY A_ID ORDER BY P.P ASC) AS RN
FROM AssetTable A
LEFT JOIN Priority P ON A.Zone = P.Zone
) SUB
WHERE RN = 1
我不确定我的语法是否适合CTE for Oracle中的VALUES。如果这给出了错误替换为:
WITH Priority AS
(
SELECT 'Yellow' AS Zone, 1 AS P
UNION ALL
SELECT 'Red' AS Zone, 2 AS P
UNION ALL
SELECT 'Green' AS Zone, 3 AS P
)
答案 1 :(得分:0)
使用条件聚合和case
表达式的一种方法。
select a_id
,case when yellow_count >=1 then 'Yellow'
when yellow_count = 0 and red_count >=1 then 'Red'
when yellow_count = 0 and red_count = 0 and green_count >=1 then 'Green'
end zone
from (select a_id,
count(case when zone = 'Yellow' then 1 end) yellow_count,
count(case when zone = 'Red' then 1 end) red_count
count(case when zone = 'Green' then 1 end) green_count
from cable_table
group by a_id) t
答案 2 :(得分:0)
为什么不做一个简单的事情:
SELECT A_ID, MAX( Zone )
FROM table
GROUP BY A_ID
如果某个A_ID有Yellow
,则max(区域)返回Yellow
如果某些A_ID没有Yellow
,但有Red
,那么最大(区域)会返回红色<br>
otherwise (no
黄色nor
红色) max( Zone ) returns
绿色
和示例:
with data as (
select 1 a_id, 1 c_id , 'Green' zone from dual union all
select 1 , 2 , 'Green' from dual union all
select 1 , 3, 'Yellow' from dual union all
select 2 , 4 , 'Green' from dual union all
select 2 , 5 , 'Red' from dual union all
select 3 , 6 , 'Yellow' from dual union all
select 3 , 7 , 'Yellow' from dual union all
select 3 , 8 , 'Yellow' from dual union all
select 3 , 9 , 'Red' from dual
)
select a_id, max( zone )
from data
group by a_id
A_ID MAX(ZO
---------- ------
1 Yellow
2 Red
3 Yellow