Creating exhaustive case columns in SQL

核能气质少年 提交于 2019-12-24 18:57:18

问题


I am trying to generate a column "Gender Combinations" that creates exhaustive categories of interaction terms like in the table below. Is there an easy way to do this in SQL (microsoft server)?

+--------------+--------------+--------------+---------------------+
| EMP 1 Gender | EMP 2 Gender | Emp 3 Gender | Gender Combinations |
+--------------+--------------+--------------+---------------------+
| Male         |              |              | 1 Male              |
| Female       |              |              | 1 Female            |
|              | Male         |              | 1 Male              |
|              | Female       |              | 1 Female            |
|              |              | Male         | 1 Male              |
|              |              | Female       | 1 Female            |
| Male         | Female       |              | 1 Male, 1 Female    |
|              | Male         | Female       | 1 Male, 1 Female    |
| Male         |              | Female       | 1 Male, 1 Female    |
|              | Female       | Male         | 1 Male, 1 Female    |
| Female       |              | Male         | 1 Male, 1 Female    |
| Female       | Male         |              | 1 Male, 1 Female    |
|              | Female       | Male         | 1 Male, 1 Female    |
| Male         |              | Female       | 1 Male, 1 Female    |
|              | Male         | Female       | 1 Male, 1 Female    |
| Male         | Male         | Female       | 1 Male, 1 Female    |
| Male         | Female       | Male         | 2 Males, 1 Female   |
| Female       | Male         | Male         | 1 Female, 2 Males   |
| Female       | Female       | Male         | 2 Females, 1 Male   |
| Female       | Male         | Female       | 2 Females, 1 Male   |
| Male         | Female       | Female       | 2 Females, 1 Male   |
| Male         | Male         | Male         | 3 Males             |
| Female       | Female       | Female       | 3 Females           |
+--------------+--------------+--------------+---------------------+

回答1:


Something like the following will probably get you going. You are looking for cross joins/cartesian product of 3 sets of data.

 ;WITH emp1 AS
 (
   SELECT 'male' AS gender
   UNION 
   SELECT 'female'
   UNION 
   SELECT ''
  ),
  emp2 AS 
  (
   SELECT 'male' AS gender
   UNION 
   SELECT 'female'
    UNION 
   SELECT ''
  ),
  emp3 AS 
  (
   SELECT 'male' AS gender
   UNION 
   SELECT 'female'
   UNION 
   SELECT ''
  )
  SELECT *, emp1.gender+','+emp2.gender+','+emp3.gender
  FROM emp1
  CROSS JOIN emp2
  CROSS JOIN emp3
  ORDER BY emp1.gender DESC,emp2.gender DESC,emp3.gender DESC

I am sure you can expand on this to match your example quite easily.




回答2:


I would use apply:

select t.*, g.gender_combination
from t cross apply
     (select ((case when num_males = 1 then '1 Male; '
                    when num_males > 1 then cast(varchar(255), num_males) + ' Males; '
                    else ''
              ) +
              (case when num_females = 1 then '1 Female; '
                    when num_females > 1 then cast(varchar(255), num_females) + ' Females; '
                    else ''
              )
             ) as gender_combination
      from (select sum(case when gender = 'Male' then 1 else 0 end) as num_males,
                   sum(case when gender = 'Female' then 1 else 0 end) as num_females                   
            from values (t.emp1_gender), (t.emp2_gender), (t.emp3_gender) as v(gender)
           ) v
     ) g;



回答3:


select t.*, g.gender_combination
from EMPGENDER t cross apply
     (select ((case when num_males = 1 then '1 Male; '
                    when num_males > 1 then cast(num_males AS varchar(255)) + ' Males; '
                    else ''
                END
              ) +
              (case when num_females = 1 then '1 Female; '
                    when num_females > 1 then cast(num_females AS varchar(255)) + ' Females; '
                    else ''
               END
              )
             ) as gender_combination
      from (select sum(case when gender = 'Male' then 1 else 0 end) as num_males,
                   sum(case when gender = 'Female' then 1 else 0 end) as num_females                   
            from (values (t.[EMP 1 Gender]), (t.[EMP 2 Gender]), 
            (t.[EMP 3 Gender])) as v(gender)
           ) v
     ) g;

small changes added at the places of case statements... and edited at table valued constructor.. Thanks for awesome solution...



来源:https://stackoverflow.com/questions/51922818/creating-exhaustive-case-columns-in-sql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!