2011-02-26 86 views
1

我在按周編碼SQL組時遇到了一些問題。有關SQL組的一些問題

我有一個名爲order的MySQL表。

在這個實體中,有幾個屬性,稱爲「ORDER_ID」,「order_date的」,「量」等

我想打一個表顯示過去7天才能銷售金額的統計信息。

我認爲首先我應該得到今天的價值。

由於我使用的Java服務器頁面,這樣的代碼:

Calendar cal = Calendar.getInstance(); 
int day = cal.get(Calendar.DATE); 
int Month = cal.get(Calendar.MONTH) + 1; 
int year = cal.get(Calendar.YEAR); 
String today = year + "-" + Month + "-" + day; 

然後,我需要在語句中使用組來計算近7天累計銷售金額的總和。

這樣的:

ResultSet rs=statement.executeQuery("select order_date, SUM(amount) " + 
    "from `testing`.`order` GROUP BY order_date"); 

我在這裏有問題。在我的SQL中,將顯示所有order_date。

我怎麼能修改此SQL,這樣只能顯示過去七天內訂單銷售金額?

除此之外,我發現在我原來的SQL的一個問題。

也就是說,如果有那一天沒有銷售,將顯示沒有結果。

當然,我知道的ResultSet不允許在我的SQL返回空值。

我只是想知道如果我需要在過去的7周階的銷售甚至量爲0美元,

我可以有其他的方法來顯示0?

如果您有想法,請給我建議。

謝謝。

回答

0

要回答你的問題:「我怎麼能修改此SQL,這樣只能顯示過去七天內訂單銷售金額?」

其中order_date的> = @ date_7days_ago

這個@ date_7days_ago日期變量的值可以在語句之前設置:

選擇

通過添加where子句來修改它的SQL語句@ date_7days_ago = DATEADD(DD,-7,GETDATE())

並稱,where子句的查詢將返回只記錄其訂單日期在過去七天。

希望這會有所幫助。

+0

由於我通常在SQL存儲過程中執行此操作,所以我忘記提及建議您使用存儲過程而不是文本語句。 – 2011-02-26 14:44:48

0

您可以嘗試使用此:

ResultSet rs = statement.executeQuery(
    "SELECT IFNULL(SUM(amount),0) 
    FROM table `testing`.`order` 
    WHERE order_date >= DATE_SUB('" + today + "', INTERVAL 7 DAY)" 
); 

這將讓你在過去的7天內提出的訂單數量,和0,如果什麼都沒有。

1

通常會發生這樣的情況:使用腳本或存儲過程創建包含所有日期的日曆表。

但是,如果您願意,您可以使用單個查詢創建一個包含少量日期(上個星期的日期)的表格。

這是一個例子:

create table orders(
id int not null auto_increment primary key, 
dorder date, 
amount int 
) engine = myisam; 

insert into orders (dorder,amount) 
values (curdate(),100), 
     (curdate(),200), 
     ('2011-02-24',50), 
     ('2011-02-24',150), 
     ('2011-02-22',10), 
     ('2011-02-22',20), 
     ('2011-02-22',30), 
     ('2011-02-22',5), 
     ('2011-02-19',10); 

select t.cdate,sum(coalesce(o.amount,0)) as total 
from (
select curdate() - 
interval tmp.digit * 1 day as `cdate` 
from (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 union all 
select 6 union all 
select 7) as tmp) as t 
left join orders as o 
on t.cdate = o.dorder and o.dorder >= curdate() - interval 7 day 
group by t.cdate 
order by t.cdate desc 

希望它幫助。問候。

+0

對不起。我犯了一個錯誤。由於加入,結果加倍。我必須找到解決這個問題的辦法。 – 2011-02-27 23:04:09

+0

我修改了查詢。現在它可以工作。但是如果有人能夠解決這個問題,而沒有「/ 2壞技巧」,我想知道它。 – 2011-02-27 23:17:13

+0

你確定你需要'/ 2'嗎?我在SQL Server上運行你的代碼,沒有它就得到了預期的結果。 '2011-02-27 \t 300','2011-02-26 \t 0' ...'2011-02-24 \t 200' ...'2011-02-22 \t 65' .... – 2011-02-27 23:33:45