SQL Граф с делом - PullRequest
       3

SQL Граф с делом

0 голосов
/ 09 марта 2020

Я пытаюсь сделать что-то вроде этого.

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. Таблица_1 содержит следующие столбцы: device_id (PK), device_name

Что я в основном пытаюсь сделать, так это то, что я хочу, чтобы подсчет всех устройств с уровнем сигнала был хорошим или плохим, но я получаю общее количество записей. из таблицы не на основании недавнего устройства signal_info. Извините за что-нибудь, если неясно.

Примечание. Использование SQL Сервер не MySQL

Ответы [ 4 ]

2 голосов
/ 09 марта 2020

Попробуйте это:

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
2 голосов
/ 09 марта 2020

Вы почти на месте - вы просто пропускаете звонок на 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;
1 голос
/ 09 марта 2020

Попробуйте это:

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
0 голосов
/ 09 марта 2020

Приведенные выше ответы верны, посмотрите пример данных и вывод. Если у вас другое требование, предоставьте пример данных.

--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
...