2013-07-12 15 views
0

我有一個名爲數據庫表user_transaction,其結構如下:如何使用SQL查詢顯示以下方案的月結果?

transaction_id mediumint(6) UNSIGNED (PK) 
transaction_no varchar(55) 
transaction_cc_avenue_no varchar(55) 
transaction_card_category varchar(100) 
transaction_user_id  varchar(32) 
transaction_user_name varchar(255) 
transaction_user_email_id varchar(255) 
transaction_deal_code varchar(10) 
transaction_dc_id smallint(4) 
transaction_amount float(10,2) 
transaction_discount float(10,2) 
transaction_total_amount float(10,2) 
transaction_data_assign enum('0', '1') 
transaction_status enum('success', 'inprocess', 'fail', 'cancelled')  
transaction_date bigint(12) 
transaction_update_date bigint(12) 
transaction_update_user_id varchar(32) 

我使用UNIX時間戳值的日期存儲在列transaction_date。現在我想顯示月份編號。對於表中存在的所有transaction_dates,不同transaction_status(即,總交易發生在每個日期,狀態'success','inprocess','fail'和'cancelled')的交易總數。這些記錄應按月份分組。爲了得到這個結果,我嘗試了很多,但沒有取得任何成功。爲您的參考我給我的查詢下面:

SELECT COUNT(*) `total count`, SUM(transaction_status = 'success') `success`, SUM(transaction_status = 'inprocess') `inprocess`, SUM(transaction_status = 'fail') `fail`, SUM(transaction_status = 'cancelled') `cancelled` FROM user_transaction GROUP BY FROM_UNIXTIME(transaction_date) 

任何人都可以在這方面幫助我嗎?提前致謝。

+0

@Eric Wich&@D Mac:我想顯示月份沒有。好。那麼我應該如何編寫查詢? – PHPLover

+0

我已經更新了我的答案,以顯示年份和月份(您需要一年的時間,以便在每年的變化中對月份進行消歧)。 –

+0

@Eric Wich:通過使用您的查詢,我得到的不是每月的datewise結果。 – PHPLover

回答

1

如果您只將transaction_date設置爲日期,那將會容易得多。然後你可以使用內置的功能。

例如,你可以做

SELECT year(transaction_date), month(transaction_date), 
    sum(whatever), ... 
FROM user_transaction 
GROUP BY YEAR(transaction_date), MONTH(transaction_date) 
ORDER BY YEAR(transaction_date), MONTH(transaction_date); 

如果你有一個厭惡改變TRANSACTION_DATE的數據類型,那麼你可以把它轉換與FROM_UNIXTIME飛。我不建議這麼做,因爲它在每個查詢中都是一個額外的(不必要的)處理層。然而,這將意味着你可以留下你的架構它的方式和寫:

SELECT year(FROM_UNIXTIME(transaction_date)), month(FROM_UNIXTIME(transaction_date)), 
    sum(whatever), ... 
FROM user_transaction 
GROUP BY YEAR(FROM_UNIXTIME(transaction_date)), MONTH(FROM_UNIXTIME(transaction_date)) 
ORDER BY YEAR(FROM_UNIXTIME(transaction_date)), MONTH(FROM_UNIXTIME(transaction_date)); 

討厭的,是不是?你最好做一個'ALTER TABLE CHANGE COLUMN transaction_date transaction_date date',然後利用簡單易用的MySQL函數獲得日期數學的所有優點。