基本思想是反透视和计数。如果您的数据库支持横向连接(aka cross apply
)并且values()
您可以执行以下操作:
select x.hardware, count(x.val) cnt
from employee as e
inner join empattributes as ea on ea.eaempid = e.empid
cross join lateral (values
('EAMacBook13', ea.EAMacBook13),
('EAMacBook16', ea.EAMacBook16),
('EAStandLaptop', ea.EAStandLaptop)
) x(hardware, val)
where e.empprojid = 1
group by x.hardware
横向连接有不同的语法,具体取决于您的数据库。一些数据库使用cross apply
而不是cross join lateral
.
values()
也不是到处都支持。例如,在 Oracle 中,您可以将横向连接表述为:
cross apply (
select 'EAMacBook13' as hardware, EAMacBook13 as val from dual
union all select 'EAMacBook16', EAMacBook16 from dual
union all select 'EAStandLaptop', EAStandLaptop from dual
) x(hardware)
如果这些都不可用,那么我们可以回退union all
:
select x.hardware, count(x.val) cnt
from employee as e
inner join (
select eaempid, 'EAMacBook13' as hardware, EAMacBook13 as value from empattributes
union all select eaempid, 'EAMacBook16', EAMacBook16 from empattributes
union all select eaempid, 'EAStandLaptop', EAStandLaptop from empattributes
) x on x.eaempid = e.empid
where e.empprojid = 1
group by x.hardware