[英]SQL Count with Case
我正在嘗試做這樣的事情。
signal_status signal_count
---------------|---------------
Average | 10
Good | 11
Very Poor | 4
Poor | 5
Below Average | 8
Excellent | 13
設備總數為 51,其計數應按照上面在 signal_count 中定義的方式進行。
我所取得的是獲得了signal_status(僅第一列)。 現在我也想要計數,但無法根據設備獲得計數。 這是我試圖獲取第一列的查詢。
select signal_status from (select case
when signal_info <= 31 and signal_info > 24 then 'Excellent'
when signal_info <= 24 and signal_info > 19 then 'Good'
when signal_info <= 19 and signal_info > 14 then 'Average'
when signal_info <= 14 and signal_info > 9 then 'Below Average'
when signal_info <= 9 and signal_info > 5 then 'Poor'
when signal_info <= 5 and signal_info > 0 then 'Very Poor' end
AS signal_status from data_channel) AS WTH group by signal_status;
我嘗試了所有可能的方法,但無法獲取所需的結果。 data_channel 表包含以下列: sno (PK), device_id, signal_info, datetime
,我希望它與 table_1 連接以加入 device_id。 table_1 包含以下列: device_id (PK), device_name
基本上我想要做的是我想要所有設備的信號強度為好或差的計數,但我得到的是表中的總記錄,而不是基於最近的設備信號信息。 如果不清楚,請見諒。
注意:使用 SQL Server 而不是 MySQL
你就快到了——你只是錯過了在你的選擇列表中count
的電話:
SELECT signal_status,
COUNT(*) -- Here!
FROM (SELECT CASE WHEN signal_info <= 31 AND signal_info > 24 THEN 'Excellent'
WHEN signal_info <= 24 AND signal_info > 19 THEN 'Good'
WHEN signal_info <= 19 AND signal_info > 14 THEN 'Average'
WHEN signal_info <= 14 AND signal_info > 9 THEN 'Below Average'
WHEN signal_info <= 9 AND signal_info > 5 THEN 'Poor'
WHEN signal_info <= 5 AND signal_info > 0 THEN 'Very Poor'
END AS signal_status
FROM data_channel) AS wth
GROUP BY signal_status;
嘗試這個:
SELECT signal_status, COUNT(device_id) signal_count
FROM
(
SELECT CASE
WHEN signal_info <= 31 and signal_info > 24 THEN 'Excellent'
WHEN signal_info <= 24 and signal_info > 19 THEN 'Good'
WHEN signal_info <= 19 and signal_info > 14 THEN 'Average'
WHEN signal_info <= 14 and signal_info > 9 THEN 'Below Average'
WHEN signal_info <= 9 and signal_info > 5 THEN 'Poor'
WHEN signal_info <= 5 and signal_info > 0 THEN 'Very Poor'
END signal_status
,device_id
,ROW_NUMBER() OVER (PARTITION BY device_id ORDER BY [datetime] DESC) AS [RowID]
FROM data_channel
) AS WTH
WHERE [RowID] = 1
GROUP BY signal_status
試試這個:
SELECT signal_status, COUNT(DISTINCT device_id) signal_count FROM (
SELECT
CASE
WHEN signal_info <= 31 and signal_info > 24 THEN 'Excellent'
WHEN signal_info <= 24 and signal_info > 19 THEN 'Good'
WHEN signal_info <= 19 and signal_info > 14 THEN 'Average'
WHEN signal_info <= 14 and signal_info > 9 THEN 'Below Average'
WHEN signal_info <= 9 and signal_info > 5 THEN 'Poor'
WHEN signal_info <= 5 and signal_info > 0 THEN 'Very Poor'
END signal_status, device_id
FROM data_channel
) AS WTH
GROUP BY signal_status
以上答案是正確的,查看樣本數據和輸出。 如果您有不同的要求,請提供示例數據。
--drop table #data_channel
create table #data_channel
(
sno int identity primary key,
device_id varchar(100),
signal_info int
)
insert into #data_channel values
('A',24),
('B',14),
('C',24),
('D',31),
('E',1),
('F',13),
('G',20),
('H',12)--,('A',24),('A',24),('A',24),('A',24),('A',24),('A',24),
詢問
select signal_status,Count(*) as signalcount
from (select case
when signal_info <= 31 and signal_info > 24 then 'Excellent'
when signal_info <= 24 and signal_info > 19 then 'Good'
when signal_info <= 19 and signal_info > 14 then 'Average'
when signal_info <= 14 and signal_info > 9 then 'Below Average'
when signal_info <= 9 and signal_info > 5 then 'Poor'
when signal_info <= 5 and signal_info > 0 then 'Very Poor' end
AS signal_status from #data_channel) AS WTH group by signal_status;
輸出
signal_status signalcount
Below Average 3
Excellent 1
Good 3
Very Poor 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.