【问题标题】:SQL Count with Case带大小写的 SQL 计数
【发布时间】:2020-06-21 01:42:18
【问题描述】:

我正在尝试做这样的事情。

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

基本上我想要做的是我希望所有设备的信号强度为平均好或差的设备的计数,但我得到的是表中的总记录,而不是基于最近的设备 signal_info。 如果不清楚,请原谅。

注意:使用 SQL Server 而不是 MySQL

【问题讨论】:

  • 我这样做了,但那是根据设备 ID 返回未返回数据的总行数。使用计数与连接但从表中获取记录总数。
  • recent device signal_info 是什么意思?您是否对同一设备有多个读数,而您只需要查看其中的最后一个吗?如果你能写下正确的需求,那么通常解决方案也会变得清晰。

标签: sql sql-server tsql select count


【解决方案1】:

试试这个:

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

【讨论】:

  • 在 signal_count 中返回 1
  • 请问您可以发布您的查询结果吗?
  • 这是它返回的 ` 平均 | 1 好 | 1 很差 | 1 差 | 1 低于平均水平 | 1 优秀 | 1 `
  • 亲爱的@Nayanish signal_count 基本上是当前具有特定signal_state 的device_id 的计数。
  • 你想要 device_id 而不是 signal_status 的计数吗?
【解决方案2】:

您就快到了 - 您只是在选择列表中错过了对 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;

【讨论】:

  • 之前尝试过,但它是根据deivce_id返回表中的所有记录。
  • @AhmedAnsari 我不明白那句话。想澄清一下吗?
  • 它以这种方式返回所有记录`平均|第3257章1100 很差 |第2668章24 低于平均水平 | 57 优秀 |第431章
  • 亲爱的@Mureinik signal_count 基本上是device_id 的计数,它们当前具有特定的signal_state,如Good、Poor 或Excellent 等。
  • 亲爱的@gotqn,正如上面在评论中提到的,这个查询返回了我在那个特定的 signal_status 状态下的所有记录。我真正想要的是 signal_count 应该包含目前处于该状态的设备总数。
【解决方案3】:

以上答案都是正确的,看看样本数据和输出。如果您有不同的要求,请提供示例数据。

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

【讨论】:

    【解决方案4】:

    试试这个:

    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
    

    【讨论】:

    • 非常感谢。得到了我想要的结果:)
    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 2020-06-20
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多