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