简单的MYSQL计数,分组,不使用Pentaho Report Designer CE

时间:2015-05-12 14:52:01

标签: mysql sql count pentaho

我需要编写一个查询,它将从两个不同的表中提取,计算结果并在一行中返回给我,即总结果。

我遇到了一些问题。当我运行查询而不是计数表达式时,我返回645行。 645是正确的数字,我想返回1行显示总数为“645”。

当我使用count表达式时,它会计算 one 表中的总行数而不是两者,所以使用count表达式,我返回761(这是没有子句的总行数)生效)。

SELECT
     `cuesheet_tx_dates`.`txdate`,
     `cuesheet_tx_dates`.`trans_station`,
     `cuesheets`.`status`,
     count(`cuesheet_tx_dates`.`txdate`)
FROM
     `cuesheet_tx_dates` INNER JOIN `cuesheets` ON `cuesheet_tx_dates`.`cuesheets_id` = `cuesheets`.`id`
WHERE
     `cuesheet_tx_dates`.`txdate` BETWEEN "15-01-01"AND "15-01-31"
 AND `cuesheet_tx_dates`.`trans_station` = "HIS"
HAVING
     `cuesheets`.`status` = "C"

如果我使用Group By,则查询将不会与Having子句一起运行。我不知道为什么,它只是拒绝运行。这将显示2行,1显示645,另一行显示116(116 + 645 = 761)。任何帮助将不胜感激。

我是MYSQL的新手,没有培训,没有监督,没有团队可以帮助上网,所以请原谅我说过或做过的任何愚蠢的事情

2 个答案:

答案 0 :(得分:1)

如果你想要一个返回一个结果并进行过滤的查询,那么我期待这样的事情:

SELECT count(*)
FROM cuesheet_tx_dates td INNER JOIN
     cuesheets s
     ON td.cuesheets_id = s.id
WHERE td.txdate BETWEEN '2015-01-01' and '2014-01-31' AND 
      td.trans_station = 'HIS' AND
      s.status = 'C';

我所做的更改主要是为了提高可读性:

  • 较短的表别名。
  • '而不是"的字符串分隔符(第一个是ANSI标准)
  • 删除HAVING子句,该子句几乎从不在没有group by的聚合查询中使用。
  • 将ISO标准格式用于日期常量。

答案 1 :(得分:0)

...或者如果你想要显示分组数据

SELECT cuesheet_tx_dates.txdate,
       cuesheet_tx_dates.trans_station,
       cuesheets.status,
       count(*) AS number_of_records
FROM cuesheet_tx_dates td INNER JOIN
     cuesheets s
     ON td.cuesheets_id = s.id
WHERE td.txdate BETWEEN '2015-01-01' and '2014-01-31' AND 
      td.trans_station = 'HIS' AND
      s.status = 'C'
GROUP BY cuesheet_tx_dates.txdate,
         cuesheet_tx_dates.trans_station,
         cuesheets.status;