MySQL - 按多个记录分类的COUNT个散点图

时间:2016-08-04 18:41:16

标签: mysql sql

我有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中执行。

2 个答案:

答案 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