2012-09-10 38 views
0

我有一个数据组,看起来像这样:的Oracle SQL摘要/枢轴表

ID  Description      Team 
    A  Missing Name; Missing Gender Team1 
    B  Missing Gender     Team1 
    C  Missing Name     Team2 
    D  Missing Name     Team2 

即,每个ID具有一个线,以识别与该ID的任何问题文本列(介绍),以及作为该ID所属的团队的名称。我已经成功地概括它:

Team  Missing Gender  Missing Name 
    Team1  2     1 
    Team2  0     2 

通过使用一个case语句看起来像这样:

 SELECT 
    "Team", 
    sum(case when "DQ Info" like '%Missing Gender%' then 1 ELSE 0 END) as "Missing Gender", 
    sum(case when "DQ Info" like '%Missing Name%' then 1 ELSE 0 END) as "Missing Name" 
    FROM 
    (*) 
    GROUP BY "Team" 

我希望能够使它看起来像来概括这个数据这个代替:

Description   Team1  Team2 
    Missing Gender  2   0 
    Missing Name  1   2 

我知道一定有这样做的一种方式,但我此刻的挣扎 - 在上述领域只使用“说明”,而不是“团队”给出了这样的结果:

Description      Team1  Team2 
    Missing Name; Missing Gender 1   0 
    Missing Gender     1   0 
    Missing Name     0   2 

这不是我所追求的。任何帮助表示赞赏,但我会继续修改,所以如果我设法弄清楚,我会更新这篇文章。请注意,这仅仅是数据集的一个例子,而不是实际的数据集。

编辑:根据bpgergo的建议进行查询。在完成一些阅读后,看起来下面将会短路,即一旦满足内部情况下的第一个标准就终止查询,这意味着它将永远不能够多次计数列。这是一个耻辱,但我认为我将不得不坚持我的原始查询。

SELECT 
    "Description", 
    sum(case when "Team" like 'Team1' then 1 ELSE 0 END) as "Team1", 
    sum(case when "Team" like 'Team2' then 1 ELSE 0 END) as "Team2" 
    FROM(SELECT 
    "Team", 
    case when "DQ Info" like '%[Check Role]%' then '[Check Role]' 
    ELSE case when "DQ Info" like '%[Client deceased]%' then '[Client deceased]' 
    ELSE case when "DQ Info" like '%[2 Parents not recorded]%' then '[2 Parents not recorded]' 
    ELSE case when "DQ Info" like '%[Religion not recorded]%' then '[Religion not recorded]' 
    ELSE case when "DQ Info" like '%[1st Language not recorded]%' then '[1st Language not recorded]' 
    ELSE case when "DQ Info" like '%[Ethnicity not recorded]%' then '[Ethnicity not recorded]' 
    ELSE case when "DQ Info" like '%[No Current Worker]%' then '[No Current Worker]' 
    ELSE case when "DQ Info" like '%[No Current Team]%' then '[No Current Team]' 
    ELSE case when "DQ Info" like '%[Update Gender]%' then '[Update Gender]' 
    ELSE case when "DQ Info" like '%[No Plan]%' then '[No Plan]' 
    ELSE case when "DQ Info" like '%[Update Plan]%' then '[Update Plan]' 
    END END END END END END END END END END END 
    as "Description" 
    FROM(
    * 
    FROM 
    (*)WORKLOAD)DATA) 
    GROUP BY "Description" 

回答

0

你已经半途而废了。尝试这样的事情作为一个内部的选择

select 
case when "Description" like '%Missing Gender%' then "Missing_gender" 
ELSE case when "Description" like '%Missing Name%' then "Missing_name" ELSE null END 
END as "Description", 
Team 
from your_table 

整个选择会是这样的

SELECT 
"Description", 
sum(case when "Team" = 'Team1' then 1 ELSE 0 END) as "Team1", 
sum(case when "Team" = 'Team2' then 1 ELSE 0 END) as "Team2", 
FROM 
(
    select 
    case when "Description" like '%Missing Gender%' then "Missing_gender" 
    ELSE case when "Description" like '%Missing Name%' then "Missing_name" ELSE null END 
    END as "Description", 
    Team 
    from your_table 
) 
GROUP BY "Description" 
+0

感谢 - 这是有道理的。但是,当我运行查询时,它不会返回所有的“描述”类别,也不是正确的计数。我认为当在内部查询中使用大小写时,它只是识别“说明”中的第一个错误 - 所以如果一个ID有2个错误,上面的查询只会识别该查询中的第一个错误(希望这很有道理! )。我已经发布了上述查询的缩写版本。 – bawpie