SQL显示表在垂直方向

时间:2017-04-30 13:07:04

标签: c# mysql sql

我正在使用C#和MySQL作为(DBMS)我想要旋转我的表。这是我的疑问:

SELECT  p.gender,Count(CASE WHEN disease like '%Anemia%' THEN 1 END) AS 'Anemia'
       ,Count(CASE WHEN disease like '%Injuries%' THEN 1 END) AS 'Injuries'
FROM  phc_db.record r, phc_db.patient p
where r.malteser_id=p.malteser_id
group by p.gender

结果是:

Gender  Anemia  Injuries
------------------------
Female  1   0

Male    2   1
------------------------

我想要:

Disease  Male   Female
----------------------

Anemia   2      1

Injuries 1      0
----------------------

任何想法?有什么建议吗? 谢谢

3 个答案:

答案 0 :(得分:2)

交换聚合:

SELECT
    (CASE WHEN disease LIKE '%Anemia%'   THEN 'Anemia'
          WHEN disease like '%Injuries%' THEN 'Injury'
     END) AS disease,
     SUM (p.gender = 'Female') AS females,
     SUM (p.gender = 'Male')   AS males
FROM phc_db.record r
INNER JOIN phc_db.patient p
     ON r.malteser_id = p.malteser_id
WHERE disease REGEXP 'Anemia|Injuries'
GROUP BY disease;

答案 1 :(得分:2)

您可以尝试转动疾病而不是性别。在这种情况下,性别成为专栏。

SELECT
    disease,
    SUM(CASE WHEN p.gender = 'Male'   THEN 1 END) AS Male,
    SUM(CASE WHEN p.gender = 'Female' THEN 1 END) AS Female
FROM phc_db.record r
INNER JOIN phc_db.patient p
    ON r.malteser_id = p.malteser_id
GROUP BY disease
WHERE disease IN ('Anemia', 'Injuries')

请注意,从您当前的输出中看来,您可能不需要使用LIKE来匹配疾病。在我上面的查询中,我检查了贫血和受伤的确切疾病名称。如果我错误地假设,那么你可以带回LIKE

答案 2 :(得分:0)

您可以在c#中使用以下查询来获取所有疾病

SELECT  p.gender, disease
FROM  phc_db.record r, phc_db.patient p
where r.malteser_id=p.malteser_id

使用以下c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Gender", typeof(string));
            dt.Columns.Add("Disease", typeof(string));


            dt.Rows.Add(new object[] { "Male", "Anemia"});
            dt.Rows.Add(new object[] { "Female", "Anemia"});
            dt.Rows.Add(new object[] { "Male", "Anemia"});
            dt.Rows.Add(new object[] { "Female", "Anemia"});
            dt.Rows.Add(new object[] { "Male", "Anemia"});
            dt.Rows.Add(new object[] { "Male","Injuries" });
            dt.Rows.Add(new object[] { "Female", "Injuries" });
            dt.Rows.Add(new object[] { "Male", "Injuries" });
            dt.Rows.Add(new object[] { "Female", "Injuries" });

            string[] uniqueDieses = dt.AsEnumerable().Select(x => x.Field<string>("Disease")).Distinct().ToArray();

            DataTable pivot = new DataTable();
            pivot.Columns.Add("Disease", typeof(string));
            pivot.Columns.Add("Male", typeof(int));
            pivot.Columns.Add("Female", typeof(int));

            var groups = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("Disease")).Select(x => new
                {
                    disease = x.Key,
                    male = x.Where(y => y.Field<string>("Gender") == "Male").Count(),
                    female = x.Where(y => y.Field<string>("Gender") == "Female").Count()
                }).ToList();

            foreach (var group in groups)
            {
                pivot.Rows.Add(new object[] { group.disease, group.male, group.female });
            }
        }
    }
}