2017-10-12 18 views
2

私はテーブルに日付の列を持っています。最後の6週間の注文数をWeek1、Week2 ... Week6(これは週番号ではない単純なシリアル番号)として計算する必要があります。ユーザーが2017年12月10日(DD/MM/YYYY)として日付を選択した場合たとえば、それは順序が誰かが私はこのかどうか知らせてくださいでき週単位でデータを表示する

below image:

として週の日付カウント計算する必要がありますSQLで可能ですか?

+0

このデータはneccessarily DBに属していません。代わりにその場で計算してください... BTWは、 '-'で区切られたデータをデータベースに保存するのを取り除きます。 –

+0

どうすれば計算できますか?私は ' SUM選択以下のコードと試みた(ケース場合CMTOrder.CreateTimestampとDATEADD次いで(DD、-7、CMTOrder.CreateTimestamp 1つの)他0端部との間CMTOrder.OrderPickUpTimestamp)CMTOrder'それAS CMT.OrderCommitmentScheduleAssociation FROM [Week1] として私のために働かなかった。私が付いているスクリーンショットのほんの一例です。私のDB doesnotはtatのようなデータを保持しません。 –

答えて

1

これはSQLコードで可能です。ここで

クエリ

SELECT 
    CONCAT(week1.first_day, '-', week1.second_day) AS Week1 
, CONCAT(week2.first_day, '-', week2.second_day) AS Week2 
, CONCAT(week3.first_day, '-', week3.second_day) AS Week3 
, CONCAT(week4.first_day, '-', week4.second_day) AS Week4 
, CONCAT(week5.first_day, '-', week5.second_day) AS Week5 
, CONCAT(week6.first_day, '-', week6.second_day) AS Week6 
FROM (
SELECT 
    DATE_FORMAT(@first_date_of_week, '%d/%m/%Y') AS first_day 
    , DATE_FORMAT(@date, '%d/%m/%Y') AS second_day 
) 
week1 
CROSS JOIN (
    SELECT 
     DATE_FORMAT(@first_date_of_week - INTERVAL 1 WEEK, '%d/%m/%Y') AS first_day 
    , DATE_FORMAT(@first_date_of_week - INTERVAL 1 WEEK + INTERVAL 1 WEEK - INTERVAL 1 DAY, '%d/%m/%Y') AS second_day 
) 
week2 
CROSS JOIN (
    SELECT 
     DATE_FORMAT(@first_date_of_week - INTERVAL 2 WEEK, '%d/%m/%Y') AS first_day 
    , DATE_FORMAT(@first_date_of_week - INTERVAL 2 WEEK + INTERVAL 1 WEEK - INTERVAL 1 DAY, '%d/%m/%Y') AS second_day 
) 
week3 
CROSS JOIN (
    SELECT 
     DATE_FORMAT(@first_date_of_week - INTERVAL 3 WEEK, '%d/%m/%Y') AS first_day 
    , DATE_FORMAT(@first_date_of_week - INTERVAL 3 WEEK + INTERVAL 1 WEEK - INTERVAL 1 DAY, '%d/%m/%Y') AS second_day 
) 
week4 
CROSS JOIN (
    SELECT 
     DATE_FORMAT(@first_date_of_week - INTERVAL 4 WEEK, '%d/%m/%Y') AS first_day 
    , DATE_FORMAT(@first_date_of_week - INTERVAL 4 WEEK + INTERVAL 1 WEEK - INTERVAL 1 DAY, '%d/%m/%Y') AS second_day 
) 
week5 
CROSS JOIN (
    SELECT 
     DATE_FORMAT(@first_date_of_week - INTERVAL 5 WEEK, '%d/%m/%Y') AS first_day 
    , DATE_FORMAT(@first_date_of_week - INTERVAL 5 WEEK + INTERVAL 1 WEEK - INTERVAL 1 DAY, '%d/%m/%Y') AS second_day 
) 
week6 

CROSS JOIN (
    SELECT 
     @date := STR_TO_DATE('12/10/2017', '%d/%m/%Y') AS DATE 
    , @first_date_of_week := @date - INTERVAL (DAYOFWEEK(@date) - 1) DAY AS first_date_of_the_week 
) init_user_params 

結果

Week1     Week2     Week3     Week4     Week5     Week6     
--------------------- --------------------- --------------------- --------------------- --------------------- ----------------------- 
08/10/2017-12/10/2017 01/10/2017-07/10/2017 24/09/2017-30/09/2017 17/09/2017-23/09/2017 10/09/2017-16/09/2017 03/09/2017-09/09/2017 
0

は、同じ結果を達成するための別の方法である -

select CONCAT(subdate(CURDATE(), INTERVAL (weekday(CURDATE())+1) DAY), ' - ', CURDATE()) 
     ,CONCAT(subdate(date_sub(CURDATE(), interval 7 day), INTERVAL (weekday(CURDATE())+1) DAY), ' - ', subdate(CURDATE(), INTERVAL (weekday(CURDATE())+2) DAY)) 
     ,CONCAT(subdate(date_sub(CURDATE(), interval 14 day), INTERVAL (weekday(CURDATE())+1) DAY), ' - ', subdate(date_sub(CURDATE(), interval 7 day), INTERVAL (weekday(CURDATE())+2) DAY)) 
     ,CONCAT(subdate(date_sub(CURDATE(), interval 21 day), INTERVAL (weekday(CURDATE())+1) DAY), ' - ', subdate(date_sub(CURDATE(), interval 14 day), INTERVAL (weekday(CURDATE())+2) DAY)) 
     ,CONCAT(subdate(date_sub(CURDATE(), interval 28 day), INTERVAL (weekday(CURDATE())+1) DAY), ' - ', subdate(date_sub(CURDATE(), interval 21 day), INTERVAL (weekday(CURDATE())+2) DAY)) 
     ,CONCAT(subdate(date_sub(CURDATE(), interval 35 day), INTERVAL (weekday(CURDATE())+1) DAY), ' - ', subdate(date_sub(CURDATE(), interval 28 day), INTERVAL (weekday(CURDATE())+2) DAY)) 
関連する問題