我有SQL表:
CREATE TABLE `test_results` (
`id` int AUTO_INCREMENT,
`date_time` datetime,
`altpn` varchar(60),
`vsp` decimal(10,4),
PRIMARY KEY (`id`)
);
VALUES
(null, 2016-07-22 13:30:01, pn1, 14.55),
(null, 2016-07-22 13:30:02, pn1, 14.45),
(null, 2016-07-22 13:30:03, pn1, 14.55),
(null, 2016-07-22 13:30:04, pn2, 14.45),
(null, 2016-07-22 13:30:05, pn2, 14.65),
(null, 2016-07-22 13:30:06, pn2, 14.45);
我需要这样的结果:
vsp - altpn - COUNT
14.45 - pn1 - 1
14.45 - pn2 - 2
14.55 - pn1 - 2
14.55 - pn2 - 0
14.65 - pn1 - 0
14.65 - pn2 - 1
它也可以是altpn - vsp - COUNT,没关系。但是每个vsp值必须包含表中的所有pns。即便是零值。
这甚至可以吗?我可以做普通的SQL,如:
SELECT test_results.vsp,
test_results.altpn,
COUNT(*)
FROM test_results
GROUP BY test_results.vsp,
test_results.altpn
并在php中重新计算这个结果以表示我需要的内容(对于图表),但它会更容易在SQL中执行。
答案 0 :(得分:2)
SELECT d.*,
c.*,
(SELECT count(*)
FROM test_results e
WHERE e.altpn=d.idaltpn
AND e.vsp=c.idvsp)
FROM
(SELECT distinct(a.altpn) idaltpn
FROM test_results a) d,
(SELECT distinct(a.vsp) idvsp
FROM test_results a) c
答案 1 :(得分:0)
你很亲密。您需要将所有唯一vsp / altpn的列表组合在一起,然后将其连接到count子查询。我将使用不同的vps值交叉连接到altpn的不同值来为您创建该列表...如果存在确定vsp / altpn组合何时有效的内容,您可能希望使用业务逻辑你的结果。
select a.vsp, a.altpn, ifnull(counts.totalcount,0)
from (select vsp.vsp, altpn.altpn
from (select vsp
from test_results
group by vsp)vsp
join
(select altpn
from test_results
group by altpn)altpn
on 1=1) a
left join
(SELECT test_results.vsp, test_results.altpn, COUNT(*) as totalcount
FROM test_results
GROUP BY test_results.vsp, test_results.altpn) counts
on a.vsp = counts.vsp and a.altpn = counts.altpn