簡體   English   中英

如何將 GROUP BY 與子查詢范圍一起使用?

[英]How to use GROUP BY with subquery range?

我在這里很新,我正在修補 MYSQL 以獲得一種 pivot 表。

現在我被阻止在這里:

SELECT `range`,
   Sum(IF(`Vrange` = '< 5',1,0)) as `<5`,
   Sum(IF(`Vrange` = ' 5-10',1,0)) as `5-10`,
   Sum(IF(`Vrange` = ' 10-15',1,0)) as `10-15`,
   Sum(IF(`Vrange` = ' 15-20',1,0)) as `15-20`,
   Sum(IF(`Vrange` = ' 20-25',1,0)) as `20-25`,
   Sum(IF(`Vrange` = ' 20-25',1,0)) as `20-25`,
   Sum(IF(`Vrange` = '> 30',1,0)) as `>30`
FROM(
     select `Time`,`HDG`, `Vitesse`,
        case 
            when `HDG` between 1 and 90 then ' 0-90' 
            when `HDG` between 91 and 180 then ' 91-180' 
            when `HDG` between 181 and 270 then ' 181-270' 
        else '271-360' 
        end as `range`,
        case 
            when `Vitesse` between 0 and 5 then '< 5' 
            when `Vitesse` between 6 and 10 then ' 5-10' 
            when `Vitesse` between 11 and 15 then ' 10-15' 
            when `Vitesse` between 16 and 20 then ' 15-20' 
            when `Vitesse` between 21 and 25 then ' 20-25' 
            when `Vitesse` between 25 and 30 then ' 25-30' 
        else '> 30' 
        end as `Vrange`
     from DataPort 
     WHERE `Time` > now() - interval 1 day  
     ORDER BY `Time` DESC

)as SQ
GROUP BY `range`;

我得到以下答案:

|  range  |    <5   |    5-10    |   ...
|---------|---------|------------|--------
|   0-90  |     5   |     3      |
| 180-270 |     12  |     20     |

我想在每行中顯示所有范圍的項目,即 0-90 / 91-180 / 181-270 / 271-360。 這怎么可能? 如下:

|  range  |    <5   |    5-10    |   ...
|---------|---------|------------|--------
|   0-90  |     1   |     1      |
|  91-180 |     8   |     3      |
| 180-270 |     12  |     20     |
| 271-360 |     5   |     3      |

提前謝謝了

我不確定您的代碼是否有問題...您是說缺少“91-180”和“271”360”嗎?您確定您的子查詢中有與該范圍匹配的行嗎?

歡迎來到 S/O。 這應該有助於了解您的情況。 您無需執行顯式預查詢即可獲取范圍,然后在外部查詢中再次求和以獲取計數。

select
        case when DP.HDG >= 0 and DP.HDG <= 90 then '0-90'
            when DP.HDG > 90 and DP.HDG <= 180 then '91-180'
            when DP.HDG >= 180 and DP.HDG <= 270 then '181-270'
            else '271-360' end Range,
            sum( case when DP.Vitesse >= 0 and DP.Vitesse < 5 then 1 else 0 end ) ' < 5',
            sum( case when DP.Vitesse >= 5 and DP.Vitesse < 10 then 1 else 0 end ) '5-10',
            sum( case when DP.Vitesse >= 10 and DP.Vitesse < 15 then 1 else 0 end ) '10-15',
            sum( case when DP.Vitesse >= 15 and DP.Vitesse < 20 then 1 else 0 end ) '15-20',
            sum( case when DP.Vitesse >= 20 and DP.Vitesse < 25 then 1 else 0 end ) '20-25',
            sum( case when DP.Vitesse >= 25 and DP.Vitesse < 30 then 1 else 0 end ) '25-30',
            sum( case when DP.Vitesse >= 30 then 1 else 0 end ) '>30'
    from
        DataPort DP
    where
       WHERE DP.`Time` > now() - interval 1 day 
    group by
        case when DP.HDG >= 0 and DP.HDG <= 90 then '0-90'
            when DP.HDG > 90 and DP.HDG <= 180 then '91-180'
            when DP.HDG >= 180 and DP.HDG <= 270 then '181-270'
            else '271-360' end

現在,話雖如此,並且上述內容將起作用,但我想指出其中一些不太理想的部分。

我相信您的“HDG”是一個定向航向,並且在技術上始終是 0-359 度,因為 360 實際上回到了 0。

在您的 Vitesse 范圍括號中,不知道是否有任何小數/十進制值,但您使用了兩次標簽,例如5-1010-15 10 不應該只在括號之一內嗎? 您在 11 和 15 之間進行測試,所以 header 組不應該也匹配嗎?

您的結果列應命名為列。 不是空格,尤其是特殊字符、破折號等。結果應該是一個帶有直接列名的表。 它是 OUTPUT 的一部分,例如報告或 web,它具有具有適當上下文的標題列,而不是像您嘗試的那樣命名列。

最后,小心你的列名,例如'Time'盡量不要在 SQL 表列定義中使用保留關鍵字。 查看可用的命令,function 名稱等。不僅僅是時間,可能是 EntryTime、LogTime、CreateTime 或類似的。 更明確的上下文,您將避免必須為所有內容添加tick線。 此外,通過使用 table.column 或 alias.column 進行限定有助於防止在加入具有相似列名的多個表時出現歧義。

隨着您使用 SQL 的成長,只是試圖為這個和未來提出改進建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM