0

さまざまな注文を含むテーブルがあります。

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

しかし、これを 1 つのクエリで実行したいのです。これを行うためにサブクエリを使用する方法を見つけようとしています。これまでのところ、私は持っています:

SELECT * from (
  SELECT count(*) as overallTotal from ORDERS
)

これを他のサブクエリと組み合わせて、1 つのクエリで合計を取得するにはどうすればよいですか?

アップデート

元の質問は MySQL に関するものでしたが、現在は Firebird で必要です。

4

4 に答える 4

2

条件付き合計を使用すると、それを行うことができます (MySQL 構文):

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

month+12*year数式を使用して、年が変わる問題を回避します。

アップデート

同じことがFirebirdMonth(x)EXTRACT (MONTH FROM x)も当てはまります。これは見栄えが悪いので、ここには記載しませんが、自分で簡単に行うことができます。Year(x)EXTRACT (YEAR FROM x)Getdate()CURRENT_TIME

于 2013-06-27T10:25:03.353 に答える
0

おそらく、IFステートメントの結果のSUMを使用し、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

前月を探す際に年の変わり目への対応が煩雑になる

于 2013-06-27T10:23:24.790 に答える