簡體   English   中英

SELECT SQL查詢(MySQL)中的計算列

[英]Calculated column in SELECT SQL Query (MySQL)

我有以下查詢:

SELECT
a.source,
TotalCount,
ActiveCount
FROM
(
    SELECT COUNT(*) AS TotalCount, a.source
    FROM internship a
    GROUP BY a.source
) AS A
join
(
    SELECT COUNT(*) AS ActiveCount, b.source
    FROM internship b
    WHERE b.int_lastdate > CURDATE() AND b.status LIKE 'Published'
    GROUP BY b.source
) AS B
    ON A.source = B.source

上面的查詢給了我這樣的結果:

在此處輸入圖片說明

我要在此處添加另一列,即“ ExpiredCount = TotalCount-ActiveCount

我該如何實現?

您只需要一個表達式。 但是,您可以簡化查詢:

select i.source, i.TotalCount, i.ActiveCount,
       (i.TotalCount - i.ActiveCount) as ExpiredCount
from (select i.source, count(*) as TotalCount, i.source,
             sum(i.int_lastdate > curdate() and i.status like 'Published') as ActiveCount
      from internship i
      group by i.source
     ) i;

筆記:

  • 表別名應為表名稱的縮寫,因此易於閱讀。
  • 你並不需要join此查詢,只是有條件的聚集。
  • 不必要使用反引號,這會使查詢更難編寫。
  • 您問題的答案很簡單。

編輯:

如果要將其用作視圖,則FROM子句中不能有子查詢(MySQL限制):

      select i.source, count(*) as TotalCount, i.source,
             sum(i.int_lastdate > curdate() and i.status like 'Published') as ActiveCount,
             (count(*) - sum(i.int_lastdate > curdate() and i.status like 'Published')) as ExpiredCount
      from internship i
      group by i.source

Gordon的答案可能是我希望看到的DBA繼承別人的代碼。 但是我們實際上可以完全避免使用子查詢,而只需編寫以下內容:

SELECT
    source,
    COUNT(*) AS TotalCount,
    SUM(CASE WHEN int_lastdate > CURDATE() AND status LIKE 'Published'
             THEN 1 ELSE 0 END) AS ActiveCount,
    COUNT(*) - SUM(CASE WHEN int_lastdate > CURDATE() AND status LIKE 'Published'
                        THEN 1 ELSE 0 END) AS ExpiredCount
FROM internship
GROUP BY source

暫無
暫無

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

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