2017-02-17 83 views
0

我有这个专栏,Actual_Date。截至2017年12月2日的一周有8宗交易。我正在尝试使用一段SQL代码片段,该代码片段将提供前一周(从2017年6月2日星期一至17年2月12日星期日)发生的事务数量。我已经尝试将日期改为1,2,3等。并且sql仍​​然不能提供发生的正确数量的事务。我可以在我的脚本中添加哪些数字来提供数字8?特定周的交易次数

Actual_Date 
01/31/2017 
01/30/2017 
01/30/2017 
01/30/2017 
02/04/2017 
02/05/2017 
02/06/2017  1 
02/10/2017  2 
02/08/2017  3 
02/06/2017  4 
02/12/2017  5 
02/06/2017  6 
02/06/2017  7 
02/12/2017  8  <------------ Number of Transactions 

我的脚本:

select coalesce(count(case when Actual_Date = (date_trunc 
('week',Actual_Date") + '4 days'::interval)::date 
        then Actual_Date 
         end),0) "This Week" 
         from mysqltable 
+0

你不能硬编码星期的范围和数量? –

+0

我可以做到这一点,但有时我们有零交易,我想让这个过程自动化,而不是每次都改变日期。这是我的扩展的SQL脚本的一小部分,我很难解决这部分。 –

+1

'select count(*)from tablename where actual_date> = date'2017-02-06'and actual_date <= date'2017-02-12'' –

回答

1

你可以做这样的事情,给你上面提供的数据;

CREATE TABLE Transactions (
    id INT PRIMARY KEY , 
    actual_date DATE 
); 

INSERT INTO Transactions (id, actual_date) VALUES 
    (1, '2017-01-31'), 
    (2, '2017-01-30'), 
    (3, '2017-01-30'), 
    (4, '2017-01-30'), 
    (5, '2017-02-04'), 
    (6, '2017-02-05'), 
    (7, '2017-02-06'), 
    (8, '2017-02-10'), 
    (9, '2017-02-08'), 
    (10, '2017-02-06'), 
    (11, '2017-02-12'),  
    (12, '2017-02-06'), 
    (13, '2017-02-06'), 
    (14, '2017-02-12'); ` 

执行以下查询对于PostgreSQL:

SELECT 
    actual_date as "Acutal_Date", 

    extract(week FROM actual_date) as "Week_Number", 

    SUM(
    COUNT(*)) 
    OVER (
    PARTITION BY extract(week FROM actual_date) 
    ORDER BY actual_date 
    ) as "Weekly_Count" 
FROM 
    Transactions 
GROUP BY actual_date 
ORDER BY actual_date; 

或者,如果使用MySQL,使用:

SELECT 
    actual_date as "Actual_Date", 

    WEEKOFYEAR(actual_date) as "Week_Number", 

    (SELECT 
    COUNT(*) 
    FROM 
    Transactions T 
    WHERE 
    WEEKOFYEAR(T.actual_date) = WEEKOFYEAR(Transactions.actual_date) AND 
    T.actual_date <= Transactions.actual_date) as "Weekly_Count" 
FROM 
    Transactions 
GROUP BY actual_date 
ORDER BY actual_date; 

会产生:

┌─────────────┬─────────────┬──────────────┐ 
│ Acutal_Date │ Week_Number │ Weekly_Count │ 
├─────────────┼─────────────┼──────────────┤ 
│ 2017-01-30 │   5 │   3 │ 
│ 2017-01-31 │   5 │   4 │ 
│ 2017-02-04 │   5 │   5 │ 
│ 2017-02-05 │   5 │   6 │ 
│ 2017-02-06 │   6 │   4 │ 
│ 2017-02-08 │   6 │   5 │ 
│ 2017-02-10 │   6 │   6 │ 
│ 2017-02-12 │   6 │   8 │ 
└─────────────┴─────────────┴──────────────┘