2017-02-17 3 views
0

У меня есть эта колонка, Actual_Date. За неделю, закончив 2/12/2017, было проведено восемь транзакций. Я пытаюсь работать над фрагментом SQL, который предоставил бы мне количество транзакций, которые имели место на прошлой неделе (с понедельника 2/6/17 по воскресенье, 2/12/17). Я попытался изменить дни до 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, где actual_date> = date '2017-02-06' и 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 │ 
└─────────────┴─────────────┴──────────────┘ 
Смежные вопросы