簡體   English   中英

選擇總計作為同一個表中的三個字段作為一個查詢?

[英]Selecting totals as three fields from same table as one query?

我有一張包含各種訂單的表格:

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
)

如何將其與其他子查詢結合使用,以便在一個查詢中獲取總計?

UPDATE

最初的問題是MySQL,但我現在需要Firebird。

使用條件求和,你可以做到(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公式可以避免年度變化的問題。

UPDATE

使用Firebird同樣適用,您只需要使用EXTRACT (MONTH FROM x)替換Month(x) ,使用EXTRACT (YEAR FROM x) Getdate() Year(x) ,使用CURRENT_TIME Getdate() 這看起來很難看,所以我不會把它放在這里,但你可以輕松地自己做。

Posubly使用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

復雜性是由於在尋找上個月時應對年度變化而引起的

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 C AS total) AS T,
  (SELECT COUNT(*) AS thisMonth FROM C WHERE MONTH(d) = MONTH(NOW()) ) AS A,
  (SELECT COUNT(*) AS lastMonth FROM C WHERE MONTH(d) = (MONTH(NOW())+11)%12) ) AS B;

我看到你已經在使用子查詢,所以為什么不做類似下面的事情,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM