Oracle 数据透视表后列中标志的计数

Oracle 数据透视表后列中标志的计数,oracle,return-value,Oracle,Return Value,我创建了一个函数来旋转我当前的表,这样我就可以看到我的学生喜欢什么运动。我正在使用oracledb。所以现在,每项运动在旋转后都在各自的列中。如果学生喜欢某项特定的运动,则标记为1 Year Student Basketball Baseball Golf Soccer 2019 Michael 1 NA 1 NA 2018 Jason N

我创建了一个函数来旋转我当前的表,这样我就可以看到我的学生喜欢什么运动。我正在使用oracledb。所以现在,每项运动在旋转后都在各自的列中。如果学生喜欢某项特定的运动,则标记为1

    Year    Student    Basketball    Baseball    Golf    Soccer   
    2019    Michael         1           NA         1        NA
    2018    Jason           NA          NA         1        NA
    2017    Sarah           1           1          1        NA
    2016    Michelle        NA          NA         NA       NA

我想获取体育专栏的计数,看看有多少学生标记了各自的运动

select 
   SUM(CASE WHEN Basketball=1 THEN 1 ELSE 0 END) as NBA,
   SUM(CASE WHEN Baseball=1 THEN 1 ELSE 0 END) as MLB,
   SUM(CASE WHEN Golf=1 THEN 1 ELSE 0 END) as PGA,
   SUM(CASE WHEN Soccer=1 THEN 1 ELSE 0 END) as MLS
from students_sports
group by year
order by 1;
我试过上面的语法,但没有成功。我还尝试了下面的语法

select 
    sum(nvl("Basketball", 0)) as NBA,
    sum(nvl("Baseball", 0)) as MLB,
    etc....

当我运行这个查询时,我得到的是行的总数,而不是标记为1的行的实际总数。有什么想法吗

第一个语法是错误的。篮球、棒球、高尔夫、足球
列是varchar,因为您在字段中保存的是NA而不是数字。当Basketball=1时,当您在查询中进行比较时,您正在进行数值比较。因此,请按以下方式更改您的查询,并让我们知道它是否有效

**Query**  
`SELECT SUM (CASE WHEN Basketball = '1' THEN 1 ELSE 0 END) AS NBA
      ,SUM (CASE WHEN Baseball = '1' THEN 1 ELSE 0 END)   AS MLB
      ,SUM (CASE WHEN Golf = '1' THEN 1 ELSE 0 END)       AS PGA
      ,SUM (CASE WHEN Soccer = '1' THEN 1 ELSE 0 END)     AS MLS
FROM students_sports
GROUP BY year
ORDER BY 1;`
示例:


第一种语法是错误的。篮球、棒球、高尔夫、足球
列是varchar,因为您在字段中保存的是NA而不是数字。当Basketball=1时,当您在查询中进行比较时,您正在进行数值比较。因此,请按以下方式更改您的查询,并让我们知道它是否有效

**Query**  
`SELECT SUM (CASE WHEN Basketball = '1' THEN 1 ELSE 0 END) AS NBA
      ,SUM (CASE WHEN Baseball = '1' THEN 1 ELSE 0 END)   AS MLB
      ,SUM (CASE WHEN Golf = '1' THEN 1 ELSE 0 END)       AS PGA
      ,SUM (CASE WHEN Soccer = '1' THEN 1 ELSE 0 END)     AS MLS
FROM students_sports
GROUP BY year
ORDER BY 1;`
示例:


你错过了那个。感谢您的第一个查询没有问题,只要您将
student
列添加到
select
groupby
列表中,就可以了。感谢您的第一个查询没有问题,只要您将
student
列添加到
select
groupby
列表中您是正确的,它是一个varchar,因此我应该使用单引号。查询运行并输出,但在我所有的岁月里,我都得到了0分。总和部分是对每行项目的计数进行总和,这样我就知道有多少张选票投给了体育专栏。希望这有意义。你能更新数据(输入)和预期输出吗。我将为您重写查询,并解释您的查询的原因和错误。因为在当前数据中,不确定数据中的1是否只是一名学生或某个人投票给该列。所以,添加您期望的现实场景,我将相应地更新答案。例如,我只能看到Michael 2019年的数据,Jaosn 2018年的数据。所以迈克尔喜欢篮球,所以2019年你只有一个人。或者在数据透视和预期输出之前显示原始数据。您是正确的,它是一个varchar,所以我应该使用单引号。查询运行并输出,但在我所有的岁月里,我都得到了0分。总和部分是对每行项目的计数进行总和,这样我就知道有多少张选票投给了体育专栏。希望这有意义。你能更新数据(输入)和预期输出吗。我将为您重写查询,并解释您的查询的原因和错误。因为在当前数据中,不确定数据中的1是否只是一名学生或某个人投票给该列。所以,添加您期望的现实场景,我将相应地更新答案。例如,我只能看到Michael 2019年的数据,Jaosn 2018年的数据。所以迈克尔喜欢篮球,所以2019年你只有一个人。或在数据透视和预期输出之前向我们显示原始数据。