Sql 创建对相关表中的实例进行计数的查询

Sql 创建对相关表中的实例进行计数的查询,sql,oracle,Sql,Oracle,我今天已经重新写了20次这个查询,我一直在接近,但没有骰子。。。我相信这对你们来说很容易,但我的SQL(Oracle)已经相当生疏了。 我需要的是: PersonID Count1 Count2 Count3 Count4 1 0 0 2 1 2 1 1 1 0 3 1 1 1 2 数据来自多个来源。我有一张表,上面有人,还有一张表

我今天已经重新写了20次这个查询,我一直在接近,但没有骰子。。。我相信这对你们来说很容易,但我的SQL(Oracle)已经相当生疏了。 我需要的是:

PersonID  Count1  Count2  Count3  Count4
1         0       0       2       1
2         1       1       1       0
3         1       1       1       2
数据来自多个来源。我有一张表,上面有人,还有一张表,上面有值。人们可以在该表中有任意数量的值

PersonID  Item    Value
1         Check1    3
1         Check2    3 
1         Check3    4
2         Check4    2
2         Check5    3
2         Check6    1
。。等

因此,对于每个PersonID,查询将计算特定值出现的次数。值始终为1、2、3或4。我尝试执行4个子查询,但它不会从主查询中读取PersonID,只返回value=1的所有实例的计数

我当时在想做一个小组,由。。。我不知道。感谢您的帮助

ETA:我以多种方式多次删除并重新编写查询,不幸的是没有保存任何中间尝试。我最初没有把它包括进去,因为我是在重新排列它的中间,而且它不能像现在这样运行。但现在的情况是:

/*sources are the tested requirements
  values are the scores people received on the tested sources
  people are those who were tested on the requirements */

WITH sub_query4 (
    SELECT values.personid, 
        count (values.ID) as count4  --how many 4s
    FROM values 
        INNER JOIN sources ON values.valueid = sources.sourceid 
        INNER JOIN people ON people.personid = values.personid
    WHERE values.yearid = 2017  
        AND values.quarter = 'Q1'
        AND instr (sources.identifier, 'TESTBANK.01', 1 ,1) > 0
        AND values.value = '4'
    GROUP_BY people.personid
) 
SELECT p.first_name,
    p.last_name,
    p.position,
    p.email,
    p.locationid,
    sub_query4.count4 as count4   --eventually this would repeat for 1, 2, & 3
FROM people p
WHERE p.locationid=406 
    AND p.position in (9,10);

values
是表的坏名称,因为它是SQL关键字

在任何情况下,条件聚合都应该起作用:

select personid,
       sum(case when value = 1 then 1 else 0 end) as cnt_1,
       sum(case when value = 2 then 1 else 0 end) as cnt_2,
       sum(case when value = 3 then 1 else 0 end) as cnt_3,
       sum(case when value = 4 then 1 else 0 end) as cnt_4
from values
group by personid;

values
是表的坏名称,因为它是SQL关键字

在任何情况下,条件聚合都应该起作用:

select personid,
       sum(case when value = 1 then 1 else 0 end) as cnt_1,
       sum(case when value = 2 then 1 else 0 end) as cnt_2,
       sum(case when value = 3 then 1 else 0 end) as cnt_3,
       sum(case when value = 4 then 1 else 0 end) as cnt_4
from values
group by personid;

我更喜欢使用PIVOT。这是


我更喜欢使用PIVOT。这是



“我已重新编写此查询…”。什么疑问?请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅,并采用:)如果我正确理解问题陈述,则您所需的输出(“这是我需要的”)与您提供的测试行中的数据不匹配-正确吗?对于ID=1和Value=3,应该得到Count3=2(因为有三行ID=1和Value=2),对吗?那么-在基表中是否可以有任何没有行的ID?如果是这样,它们是否仍需要在输出中显示,所有值的计数都为0?如果是,身份证是从哪里来的?(这不可能仅仅来自那一张表,因为它们根本没有出现在表中。)正确,这是我的观点的简化胡言乱语。我会更新它,让它看起来更真实。更新后的帖子中包含了“我重新编写了这个查询…”的代码。什么疑问?请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅,并采用:)如果我正确理解问题陈述,则您所需的输出(“这是我需要的”)与您提供的测试行中的数据不匹配-正确吗?对于ID=1和Value=3,应该得到Count3=2(因为有三行ID=1和Value=2),对吗?那么-在基表中是否可以有任何没有行的ID?如果是这样,它们是否仍需要在输出中显示,所有值的计数都为0?如果是,身份证是从哪里来的?(这不可能仅仅来自那一张表,因为它们根本没有出现在表中。)正确,这是我的观点的简化胡言乱语。我会更新它,让它看起来更真实。更新后的帖子中包含了代码,因为iHMM的小提琴作品,但我得到了这个(SQL开发者):ORA-01748:这里只允许简单的列名01748。00000-“此处仅允许简单列名”*原因:*操作:第10行错误列:13Ok nevermind。。我的屏幕上有table.field。。。当我拿出桌子的时候。成功了。现在看看它是否在其他约束条件下成立,我需要围绕它构建…您需要使列大写。这就是oracle本机支持的语法让我抓狂的地方。嗯,小提琴可以用,但我得到了这个(SQL开发者):ORA-01748:这里只允许简单的列名01748。00000-“此处仅允许简单列名”*原因:*操作:第10行错误列:13Ok nevermind。。我的屏幕上有table.field。。。当我拿出桌子的时候。成功了。现在看看它是否在其他约束条件下成立,我需要围绕它构建…您需要使列大写。这就是oracle的原生支持Soracle的语法会让我发疯的地方。这也奏效了!它帮助我发现值被存储为一个varchar而不是一个数字,这可能是迄今为止我沮丧的主要原因。我尝试使用to_number(value),但在将另一端更改为“1”之前,比较仍然不起作用。奇怪,这也奏效了!它帮助我发现值被存储为一个varchar而不是一个数字,这可能是迄今为止我沮丧的主要原因。我尝试使用to_number(value),但在将另一端更改为“1”之前,比较仍然不起作用。奇怪的