我今天已经重写了这个查询大约20次,我一直在接近,但没有骰子……我相信这对你们来说很容易,但是我的SQL (Oracle)相当生疏。这是我需要的:
PersonID  Count1  Count2  Count3  Count4
1         0       0       2       1
2         1       1       1       0
3         1       1       1       2数据来自多个来源。我有一个表People,还有一个表Values。在该表中,人们可以有任意数量的值。
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的所有实例的计数。
我当时在想做一个Group_By ..。我不知道。如有任何帮助,我们不胜感激!
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);发布于 2018-02-13 05:58:08
对于表来说,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;发布于 2018-02-13 06:00:41
我更喜欢使用PIVOT。这是Example SQL Fiddle
SELECT "PersonID", val1,val2,val3,val4 FROM 
(
  SELECT "PersonID", "Value" from VALS
)
PIVOT 
(
     count("Value")
     FOR "Value" IN (1 as val1, 2 as val2, 3 as val3, 4 as val4)
);https://stackoverflow.com/questions/48755749
复制相似问题