SQL:基于另一个表中多行的值选择值
我有一个表网络,其中每个网络可以有多个电路。每个网络都有一个整体状态(红色/黄色/绿色),每个电路都有一个单独的状态(红色/绿色)。每个电路的状态都是手动设置的。网络的状态如下:SQL:基于另一个表中多行的值选择值,sql,Sql,我有一个表网络,其中每个网络可以有多个电路。每个网络都有一个整体状态(红色/黄色/绿色),每个电路都有一个单独的状态(红色/绿色)。每个电路的状态都是手动设置的。网络的状态如下: 如果其所有电路均为绿色-->绿色 如果其所有电路均为红色-->红色 如果至少有1条(但不是全部)电路为绿色-->黄色 如果没有电路-->NULL(无状态) 我正在尝试选择所有网络,其状态由select动态确定,而不必将状态保存并管理为表中的一列。我想不出一个有效的方法来做这件事。我现在所做的工作(都是小表,
- 如果其所有电路均为绿色-->绿色
- 如果其所有电路均为红色-->红色
- 如果至少有1条(但不是全部)电路为绿色-->黄色
- 如果没有电路-->NULL(无状态)
SELECT
(CASE
WHEN (
SELECT COUNT(*)
FROM NETWORK_CIRCUITS
WHERE network_id = N.network_id
) = 0 THEN 'noStatus'
WHEN (
SELECT COUNT(*)
FROM NETWORK_CIRCUITS
WHERE network_id = N.network_id
AND [status] = 'greenStatus'
) = (
SELECT COUNT(*)
FROM NETWORK_CIRCUITS
WHERE network_id = SSN.network_id
) THEN 'greenStatus'
WHEN (
SELECT COUNT(*)
FROM NETWORK_CIRCUITS
WHERE network_id = N.network_id
AND [status] = 'redStatus'
) = (
SELECT COUNT(*)
FROM NETWORK_CIRCUITS
WHERE network_id = N.network_id
) THEN 'redStatus'
ELSE 'yellowStatus'
END) network_status
FROM NETWORKS N
我想这应该是你想要的。它还应该比使用一堆子查询更快
SELECT CASE
WHEN circuits.network_id is NULL THEN 'No Status'
WHEN circuits.greenCount = circuits.totalCircuits THEN 'Green'
WHEN circuits.greenCount >= 1 and circuits.redCount >= 1 THEN 'Yellow'
WHEN circuits.redCount = circuits.totalCircuits THEN 'Red'
END as network_status
, N.network_id
FROM NETWORKS N
LEFT JOIN
(SELECT network_id
, sum(CASE WHEN [status] = 'redStatus' THEN 1 ELSE 0 END) as redCount
, sum(CASE WHEN [status] = 'greenStatus' THEN 1 ELSE 0 END) as greenCount
, count(*) as totalCircuits
FROM NETWORK_CIRCUITS
GROUP BY network_id) as circuits ON circuits.network_id = N.network_id
这里有一个方法:
SELECT
CASE
WHEN CircuitCount IS NULL THEN 'noStatus'
WHEN GreenCount = CircuitCount THEN 'greenStatus'
WHEN GreenCount = 0 THEN 'redStatus'
ELSE 'yellowStatus'
END As network_status
FROM NETWORKS As N
LEFT JOIN
( SELECT COUNT(*) As CircuitCount,
COUNT(NULLIF([status],'redStatus')) As GreenCount,
network_id
FROM NETWORK_CIRCUITS
GROUP BY network_id
) As C ON N.network_id = C.network_id
我的第一个想法是:
select network_id, case when green=0 and red=0 then null when green=0 then 'red' else when red=0 then 'green' else 'yellow' end as status
from
(select n.network_id,
sum(case when c.status='green' then 1 else 0 end) as green,
sum(case when c.status='red' then 1 else 0 end) as red
from network n
join circuit c on c.network_id=n.network_id
group by n.network_id)
哎呀,应该是“左连接电路”,否则我们永远不会得到空状态的情况。我无意中否决了这个,对不起(片状鼠标)。如果你对它做一些小的修改,我可以改变我的投票…@rbaryyoung对我的答案做了一些修改。