【问题标题】:Creating exhaustive case columns in SQL在 SQL 中创建详尽的案例列
【发布时间】:2018-08-20 00:18:20
【问题描述】:

我正在尝试生成一个“性别组合”列,该列创建了详尽的交互术语类别,如下表所示。有没有一种简单的方法可以在 SQL(微软服务器)中做到这一点?

+--------------+--------------+--------------+---------------------+
| 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           |
+--------------+--------------+--------------+---------------------+

【问题讨论】:

  • 我不知道如何在纯 SQL 中执行此操作,但我可以帮助您确定您的目标。这些被称为重复排列。在标准编码中,算法并不难。如果您认为这会有所帮助,我可以发布它。
  • 更好的是,这里有一个指向code review 的链接。这是一个不错的链接,带有对geeksforgeeks 的解释。我想我应该注意,在仔细查看您的输出之后,您不是在重复排列之后,或者您缺少结果(至少 4 个)。
  • 你试过什么?你能给我们看一些代码吗?
  • @JosephWood 基本上在 SQL 中,您可以进行交叉连接(是的,它确实有用)来创建集合中所有元素的笛卡尔积。所以一点也不难。

标签: sql sql-server combinations interaction generate


【解决方案1】:

类似以下的内容可能会让您继续前进。您正在寻找 3 组数据的交叉连接/笛卡尔积。

 ;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

我相信您可以对此进行扩展以非常轻松地匹配您的示例。

【讨论】:

    【解决方案2】:

    我会使用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;
    

    在 case 语句的位置添加了一些小改动...并在表值构造函数中进行了编辑。感谢您提供了很棒的解决方案...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多