簡體   English   中英

具有相同Count函數的SQL多個CASE WHEN

[英]SQL multiple CASE WHEN with same Count function

我有學生的記錄,並且需要按年齡分組。 我有這種情況:

  • 如果年齡組只有一名成員,請顯示其姓名和性別
  • 其他
    • 顯示“ SOME STRING”作為名稱
    • 檢查成員的性別,如果全部為女性,則返回女性。 如果全部為MALE,則返回MALE,否則返回MIX

我想出了這個查詢

    SELECT Count(id) as GROUP_SIZE,
    CASE WHEN COUNT(id) = 1 THEN name ELSE 'SOME STRING' END as name,
    CASE WHEN COUNT(id) = 1 THEN sex ELSE (
       CASE WHEN COUNT(CASE WHEN sex = 'MALE' THEN 1 END) = 0 THEN 'FEMALE'
            WHEN COUNT(CASE WHEN sex = 'FEMALE' THEN 1 END) = 0 THEN 'MALE'
            ELSE 'MIX'
       END
    ) END as sex
    FROM students GROUP BY age                

該查詢輸出了我想要的場景,但是我多次調用Count(id)。 調用多個Count會影響性能嗎? 或者,如果Count(id)執行一次,那么在成功調用Count(id)時是否有固定的時間? 我嘗試了CASE WHEN GROUP_SIZE但無法正常工作。 請告知我該如何改善。 謝謝。

我不確定在count(COLUMN)如何優化MySQL,但是,如果使用count(1) ,則將獲得(至少等於)最佳性能。

我希望它可以重用該值。 使用GROUP BY ,它必須將所有行收集到組中。 容納組的數據結構可能在一個元素中具有組的大小,因此它不需要進行任何實際計數,而是在創建組的過程中完成的。

對於性能可能並不重要,但是請看一下它的感覺:

SELECT  age,   -- (I think you forgot this)
        GROUP_SIZE,
        IF (GROUP_SIZE = 1, a_name, 'SOME STRING) AS name,
        IF (min_sex = max_sex, max_sex, 'MIX') AS sex
    FROM  
      ( SELECT  COUNT(*) AS GROUP_SIZE,
                MAX(name) AS a_name,
                MAX(sex) AS max_sex,
                MIN(sex) AS min_sex,
            FROM  students
            GROUP BY  age 
      ) z
    ORDER BY  age;   -- (you probably wanted this)

COUNT(*)是正常模式。 COUNT(x)檢查x是否為NULL ,並且不對其進行計數。

暫無
暫無

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

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