skip to Main Content

The table has columns English, Spanish and French. Each with yes or no values and i want to count the number of yes and no for each column into one table.

I tried using distinct count but it cannot put all columns under one table.

It should appear like this:

Key| French   | Spanish |English|
--—| -------- | ------- |——————-|  
Yes|    45    |    35   |  72   |
No |    27    |    37   |  0    |

3

Answers


  1. You could try a GROUP BY clause.

    SELECT `key`, 
      sum(`french`) as french,
      sum(`spanish`) as spanish,
      sum(`english`) as english
    FROM `answers` 
    GROUP BY `key`;
    
    key     french  spanish  english    
    no      3       2        1
    yes     1       2        3
    

    Using the following schema

    CREATE TABLE `answers` (
      `key` varchar(3) NOT NULL DEFAULT '',
      `french` int(11) NOT NULL,
      `spanish` int(11) NOT NULL,
      `english` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    INSERT INTO `answers` (`key`, `french`, `spanish`, `english`) VALUES
    ('yes', 1, 2, 3),
    ('no', 3, 2, 1);
    
    Login or Signup to reply.
  2. Assuming that your table that has the three columns English, Spanish and French is called Source_Table, here’s a query that does what you want:

    select
      'YES' Key,
      (select count(1) from Source_Table where French='YES') French, 
      (select count(1) from Source_Table where Spanish='YES') Spanish,
      (select count(1) from Source_Table where English='YES') English
    from Source_Table
    Limit 1 
    union 
      'NO' Key, 
      (select count(1) from Source_Table where French='NO') French,
      (select count(1) from Source_Table where Spanish='NO') Spanish,
      (select count(1) from Source_Table where English='NO') English
    from Source_Table
    Limit 1
    

    Hope this helps.
    Best regards.

    Login or Signup to reply.
  3. It is rather uncommon to use a string column for ‘yes’ and ‘no’ instead of a boolean column in MySQL, but well, the query is almost the same here.

    You want one result row for ‘Yes’ and one for ‘No’, but each row has a mix of yes and no values. So, you need a UNION ALL for the two result rows. The two queries you are unioning go throgh all rows and count the languages conditionally. In standard SQL we would use COUNT(*) FILTER (WHERE french = 'yes') for this, in some DBMS that don’t support the FILTER clause, we’d use COUNT(CASE WHEN french = 'yes' THEN 1 END) or SUM(CASE WHEN french = 'yes' THEN 1 ELSE 0 END), but in MySQL this gets even simpler, as true = 1 and false = 0 in MySQL, and we can use a mere SUM(french = 'yes').

    The complete query:

    select
      'Yes' as yes_or_no,
      sum(french = 'yes') as french,
      sum(spanish = 'yes') as spanish,
      sum(english = 'yes') as english
    from mytable
    union all
    select
      'No' as yes_or_no,
      sum(french = 'no') as french,
      sum(spanish = 'no') as spanish,
      sum(english = 'no') as english
    from mytable;
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search