using sql count in a case statement

前端 未结 8 1457
花落未央
花落未央 2020-12-13 17:29

I have a table and i need to present the output in the following fashion.

tb_a:

col1  |  reg_id | rsp_ind 

Count of rows with rsp_ind = 0

相关标签:
8条回答
  • 2020-12-13 17:49

    ok. I solved it

    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
    
    0 讨论(0)
  • 2020-12-13 17:51
    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;
    
    0 讨论(0)
  • 2020-12-13 17:57

    If you want to group the results based on a column and take the count based on the same, you can run the query as,

    $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";

    0 讨论(0)
  • 2020-12-13 17:58

    Depending on you flavor of SQL, you can also imply the else statement in your aggregate counts.

    For example, here's a simple table Grades:

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

    We can test out each Aggregate counter syntax like this (Interactive Demo in 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
    

    And here are the results (unpivoted for readability):

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

    Which lines up with the docs for Aggregate Functions in SQL

    Docs for COUNT:

    COUNT(*) - returns the number of items in a group. This includes NULL values and duplicates.
    COUNT(ALL expression) - evaluates expression for each row in a group, and returns the number of nonnull values.
    COUNT(DISTINCT expression) - evaluates expression for each row in a group, and returns the number of unique, nonnull values.

    Docs for SUM:

    ALL - Applies the aggregate function to all values. ALL is the default.
    DISTINCT - Specifies that SUM return the sum of unique values.

    0 讨论(0)
  • 2020-12-13 18:02
    select sum(rsp_ind = 0) as `New`,
           sum(rsp_ind = 1) as `Accepted` 
    from tb_a
    
    0 讨论(0)
  • 2020-12-13 18:10

    Close... try:

    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
    
    0 讨论(0)
提交回复
热议问题