Sql 将多行从一个表连接到一行

Sql 将多行从一个表连接到一行,sql,Sql,希望我描述这一切的方式有意义。我试图在同一列上使用多个Case语句来输出同一行中不同字段中的值。让我们以缺勤计划为例 在我的情况下,我试图审核以确保所有员工都被分配了所需的6种不同的缺勤计划。计划1、2和3各有多个计划,可分配这些计划以满足要求。(例如计划1a/计划2a/计划3a或计划1b/计划2c/计划3a…) 所有计划都存储在同一个表中,因此所有计划都在不同的行上输出。如果每个计划都已分配,我将尝试获得1行标记的输出,这将提供一个输出,其中一个人有6行单个计划显示为已分配给每行,但所有其他行

希望我描述这一切的方式有意义。我试图在同一列上使用多个Case语句来输出同一行中不同字段中的值。让我们以缺勤计划为例

在我的情况下,我试图审核以确保所有员工都被分配了所需的6种不同的缺勤计划。计划1、2和3各有多个计划,可分配这些计划以满足要求。(例如计划1a/计划2a/计划3a或计划1b/计划2c/计划3a…)

所有计划都存储在同一个表中,因此所有计划都在不同的行上输出。如果每个计划都已分配,我将尝试获得1行标记的输出,这将提供一个输出,其中一个人有6行单个计划显示为已分配给每行,但所有其他行均未分配

SELECT (CASE 
   WHEN Table1.[Plan] Like ('PlanType1')
     AND [enrectype] = 'ABS' THEN NULL
     ELSE 'Plan1 Missing'
   END) AS [Plan1],
    (CASE 
      WHEN Table1.[Plan] Like ('PlanType2')
      AND [enrectype] = 'ABS' THEN NULL
      ELSE 'Plan2 Missing'
    END) AS [Plan2],
    (CASE 
    WHEN Table1.[Plan] Like ('PlanType3')
    AND [enrectype] = 'ABS' THEN NULL
    ELSE 'Plan3 Missing'
    END) AS [Plan3],
    (CASE
    WHEN Table1.[PlanDescrip] like ('%Plan4%') THEN NULL
    ELSE 'Plan4 Missing'
    END) AS [Plan4],
    (CASE
    WHEN Table1.[PlanDescrip] like ('%Plan5%') THEN NULL
    ELSE 'Plan5 Missing'
    END) AS [Plan5],
    (CASE
    WHEN Table1.[PlanDescrip] like ('%Plan6%') THEN NULL
    ELSE 'Plan6 Missing'
    END) AS [Plan6],
大概是这样的:

SELECT max(s.[Plan1]), max(s.[Plan2]), max(s.[Plan3]),max(s.[Plan4]),max(s.[Plan5]),max(s.[Plan6])
from (
  SELECT (CASE 
   WHEN Table1.[Plan] Like ('PlanType1')
     AND [enrectype] = 'ABS' THEN NULL
     ELSE 'Plan1 Missing'
   END) AS [Plan1],
    (CASE 
      WHEN Table1.[Plan] Like ('PlanType2')
      AND [enrectype] = 'ABS' THEN NULL
      ELSE 'Plan2 Missing'
    END) AS [Plan2],
    (CASE 
    WHEN Table1.[Plan] Like ('PlanType3')
    AND [enrectype] = 'ABS' THEN NULL
    ELSE 'Plan3 Missing'
    END) AS [Plan3],
    (CASE
    WHEN Table1.[PlanDescrip] like ('%Plan4%') THEN NULL
    ELSE 'Plan4 Missing'
    END) AS [Plan4],
    (CASE
    WHEN Table1.[PlanDescrip] like ('%Plan5%') THEN NULL
    ELSE 'Plan5 Missing'
    END) AS [Plan5],
    (CASE
    WHEN Table1.[PlanDescrip] like ('%Plan6%') THEN NULL
    ELSE 'Plan6 Missing'
    END) AS [Plan6],
  ...) s
如果您根据某个属性对该信息进行分组,则根据该字段添加最后一个group by子句(在您的查询中似乎没有)

这有点麻烦--表达存在的内容比表达缺少的内容要容易得多。一种方法是两个级别的
大小写
,一个带有计数,一个带有字符串。这是另一种方法

SELECT NULLIF(MIN(CASE WHEN Table1.[Plan] Like 'PlanType1' AND [enrectype] = 'ABS' THEN 'ZZZ' ELSE 'Plan1 Missing'
                  END), 'ZZZ') AS [Plan1],
       NULLIF(MIN(CASE WHEN Table1.[Plan] Like 'PlanType2' AND [enrectype] = 'ABS' THEN 'ZZZ' ELSE 'Plan2 Missing'
                  END), 'ZZZ') AS [Plan2],
      . . .

添加您正在使用的sql语言的标记一旦处理完案例,您必须对数据应用一些聚合函数(max,min…),这样可以将所有内容都放在一行中。