Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从同一个表中选择总计作为三个字段作为一个查询?_Mysql_Sql_Firebird_Firebird2.5 - Fatal编程技术网

Mysql 从同一个表中选择总计作为三个字段作为一个查询?

Mysql 从同一个表中选择总计作为三个字段作为一个查询?,mysql,sql,firebird,firebird2.5,Mysql,Sql,Firebird,Firebird2.5,我有一张桌子,里面有各种各样的订单: ID | Date | etc... 1 | 2013-01-01 | etc 2 | 2013-02-01 | etc 3 | 2013-03-01 | etc 4 | 2013-04-01 | etc 5 | 2013-05-01 | etc 6 | 2013-06-01 | etc 7 | 2013-06-01 | etc 8 | 2013-03-01 | etc 9 | 2013-04-01 | etc 10 | 201

我有一张桌子,里面有各种各样的订单:

ID | Date       | etc...
1  | 2013-01-01 | etc
2  | 2013-02-01 | etc
3  | 2013-03-01 | etc
4  | 2013-04-01 | etc
5  | 2013-05-01 | etc
6  | 2013-06-01 | etc
7  | 2013-06-01 | etc
8  | 2013-03-01 | etc
9  | 2013-04-01 | etc
10 | 2013-05-01 | etc
我想要一个以结果结尾的查询:

overallTotal | totalThisMonth | totalLastMonth
10           | 2              | 1
但我想在一个查询中实现这一点!我正试图找到一种使用子查询来实现这一点的方法。到目前为止,我已经:

SELECT * from (
  SELECT count(*) as overallTotal from ORDERS
)
如何将其与其他子查询相结合,以便在一个查询中获得总数

更新


最初的问题是针对MySQL的,但我现在需要针对Firebird的。

使用IF语句结果的总和,IF检查它是否是相关日期

SELECT COUNT(*), 
    SUM(IF(YEAR(Date) = YEAR(CURDATE()) AND MONTH(Date) = MONTH(CURDATE()), 1, 0))
    SUM(IF((YEAR(Date) = YEAR(CURDATE()) AND MONTH(Date) = MONTH(CURDATE()) - 1) OR (YEAR(Date) = YEAR(CURDATE()) - 1 AND MONTH(Date) = 12 AND MONTH(CURDATE()) = 1), 1, 0))
from ORDERS

复杂性是由于在查找前一个月时应对年份的变化而造成的。使用条件和,您可以这样做:

select 
    count(*) as overallTotal, 
    sum(if(Month(Date)+12*Year(Date)=Month(GetDate())+12*Year(GetDate()), 1, 0)) 
       as totalThisMonth 
    sum(if(Month(Date)+12*Year(Date)=Month(GetDate())+12*Year(GetDate())-1, 1, 0)) 
       as totalThisMonth;
from mytable
使用“月+12*年”公式可以避免年变化的问题

更新

对于Firebird,同样适用,您只需将Monthx替换为从x开始的提取月份,将Yearx替换为从x开始的提取年份,将Getdate替换为当前时间。这看起来很难看,所以我不会把它放在这里,但是你可以自己做

SELECT
  (SELECT COUNT(*) FROM C AS total) AS T,
  (SELECT COUNT(*) AS thisMonth FROM C WHERE MONTH(d) = 6) AS A,
  (SELECT COUNT(*) AS lastMonth FROM C WHERE MONTH(d) = 5) AS B;
请注意,月份是硬编码的,但在应用程序级别提取当前月份应该不会太困难。如果您真的需要,可以在SQL级别使用以下方法:


我看到您已经在使用子查询了,那么为什么不执行以下操作呢

SELECT
(SELECT count(*) from ORDERS) as overallTotal,
(SELECT count(*) from ORDERS where Date between ... and ...) as totalThisMonth,
(SELECT count(*) from ORDERS where Date between ... and ...) as overallTotal

选择*的必要性是什么?您真的需要以列而不是行的形式显示结果吗?我想行也可以?
SELECT
(SELECT count(*) from ORDERS) as overallTotal,
(SELECT count(*) from ORDERS where Date between ... and ...) as totalThisMonth,
(SELECT count(*) from ORDERS where Date between ... and ...) as overallTotal