簡體   English   中英

在 case 語句中使用 sql count

[英]using sql count in a case statement

我有一張桌子,我需要以以下方式顯示輸出。

tb_a:

col1  |  reg_id | rsp_ind 

rsp_ind = 0 為 'New' 和 1 為 'Accepted' 的行數

輸出應該是

NEW | Accepted
9   | 10

我嘗試使用以下查詢。

select 
  case when rsp_ind = 0 then count(reg_id)end as 'New',
  case when rsp_ind = 1 then count(reg_id)end as 'Accepted'
from tb_a

我得到的輸出為

NEW | Accepted
NULL| 10
9   | NULL

有人可以幫我調整查詢以實現輸出。 注意:我無法在此周圍添加總和。 它是更大程序的一部分,因此我無法為此添加超級查詢。

SELECT 
    COUNT(CASE WHEN rsp_ind = 0 then 1 ELSE NULL END) as "New",
    COUNT(CASE WHEN rsp_ind = 1 then 1 ELSE NULL END) as "Accepted"
from tb_a

您可以在此處查看此請求的輸出

關閉...嘗試:

select 
   Sum(case when rsp_ind = 0 then 1 Else 0 End) as 'New',
   Sum(case when rsp_ind = 1 then 1 else 0 end) as 'Accepted'
from tb_a

根據您的 SQL 風格,您還可以在聚合計數中暗示 else 語句

例如,這是一個簡單的表Grades

| Letters |
|---------|
| A       |
| A       |
| B       |
| C       |

我們可以像這樣測試每個聚合計數器語法( SQL Fiddle 中的交互式演示):

SELECT
    COUNT(CASE WHEN Letter = 'A' THEN 1 END)           AS [Count - End],
    COUNT(CASE WHEN Letter = 'A' THEN 1 ELSE NULL END) AS [Count - Else Null],
    COUNT(CASE WHEN Letter = 'A' THEN 1 ELSE 0 END)    AS [Count - Else Zero],
    SUM(CASE WHEN Letter = 'A' THEN 1 END)             AS [Sum - End],
    SUM(CASE WHEN Letter = 'A' THEN 1 ELSE NULL END)   AS [Sum - Else Null],
    SUM(CASE WHEN Letter = 'A' THEN 1 ELSE 0 END)      AS [Sum - Else Zero]
FROM Grades

這是結果(為了可讀性而未透視):

|    Description    | Counts |
|-------------------|--------|
| Count - End       |    2   |
| Count - Else Null |    2   |
| Count - Else Zero |    4   | *Note: Will include  of  values
| Sum - End         |    2   |
| Sum - Else Null   |    2   |
| Sum - Else Zero   |    2   |

SQL 中聚合函數的文檔一致

COUNT文檔:

COUNT(*) - 返回組中的項目數。 這包括 NULL 值和重復項。
COUNT(ALL expression) - 為組中的每一行計算表達式,並返回非空值的數量。
COUNT(DISTINCT expression) - 為組中的每一行計算表達式,並返回唯一的非空值的數量。

SUM文檔:

ALL - 將聚合函數應用於所有值。 ALL 是默認設置。
DISTINCT - 指定 SUM 返回唯一值的總和。

你得到兩行而不是一行的原因是你在外部查詢中按rsp_ind分組(你沒有,讓我失望的是,與我們分享)。 如果不處理該GROUP BY項目,您無法強制執行一行而不是兩行。

如果要根據列對結果進行分組並根據相同的列進行計數,則可以將查詢運行為:

$sql = "SELECT COLUMNNAME,

COUNT(CASE WHEN COLUMNNAME IN ('YOURCONDITION') then 1 ELSE NULL END) as 'New',

COUNT(CASE WHEN COLUMNNAME IN ('YOURCONDITION') then 1 ELSE NULL END) as 'ACCPTED'

FROM TABLENAME

GROUP BY COLUMNANME";
select sum(rsp_ind = 0) as `New`,
       sum(rsp_ind = 1) as `Accepted` 
from tb_a

行。 我解決了

SELECT `smart_projects`.project_id, `smart_projects`.business_id, `smart_projects`.title,
 `page_pages`.`funnel_id` as `funnel_id`, count(distinct(page_pages.page_id) )as page_count, count(distinct (CASE WHEN page_pages.funnel_id != 0 then  page_pages.funnel_id ELSE NULL END ) ) as funnel_count
FROM `smart_projects`
LEFT JOIN `page_pages` ON `smart_projects`.`project_id` = `page_pages`.`project_id`
WHERE  smart_projects.status !=  0 
AND `smart_projects`.`business_id` = 'cd9412774edb11e9'
GROUP BY `smart_projects`.`project_id`
ORDER BY `title` DESC
CREATE TABLE #CountMe (Col1 char(1));

INSERT INTO #CountMe VALUES ('A');
INSERT INTO #CountMe VALUES ('B');
INSERT INTO #CountMe VALUES ('A');
INSERT INTO #CountMe VALUES ('B');

SELECT
    COUNT(CASE WHEN Col1 = 'A' THEN 1 END) AS CountWithoutElse,
    COUNT(CASE WHEN Col1 = 'A' THEN 1 ELSE NULL END) AS CountWithElseNull,
    COUNT(CASE WHEN Col1 = 'A' THEN 1 ELSE 0 END) AS CountWithElseZero
FROM #CountMe;

暫無
暫無

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

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