2017-06-03 55 views
0

我試圖在SQLLite中爲我的應用組織一個查詢,並希望請求一些幫助。查詢銷售情況,按星期分組

我想寫查詢:

「我與用戶ID X用戶對於我個人的工作周,這會在我想要的任何一天d(星期日開始到週六,週一至週日,等等),我想看看哪個工作周是我的最差的,這是我的最好的銷售額。

簡單地說,「最差」和「最好」僅僅意味着最高和最低的銷售總額

如果每個人的工作周在週日開始,這很容易,但事實並非如此,我必須克服將數據庫中的所有行分組的問題不僅僅是一週,而是一個自定義周(用戶定義哪一天開始和結束一週)。例如,如果我的工作周從星期天開始,那麼在過去一週,5月28日的星期是一個星期天,這是我工作周的開始(並且在6月3日星期六結束)。我會按照這個模式來查看錶格中的所有記錄。

但是,不同的用戶可以在5月29日星期一開始工作,並在6月2日星期五結束工作。

因此,這意味着對於用戶1,我想從星期天的開始日期到星期六的結束日期對他的行進行分組(然後將它們全部彙總,並將第一個和最後一個記錄用於銷售)。

對於用戶2,但是,我想他的集團在週一的日期範圍記錄到週日

這是我在哪裏爲止。我想我很接近。 (請注意,我將日期存儲爲以毫秒爲單位的unix時間戳,因此除以1000和unixepoch部分)。 + d部分實際上是一個基於一天的開始的整數,但我還沒有弄清楚這個數字應該是什麼。就在我認爲我得到它的時候,它就會在別人的一天失敗。

SELECT 'Date', SUM(Amount) 'Amount' 
FROM Sales WHERE UserID = x 
GROUP BY CAST((julianday((datetime(CreationDate/1000, 'unixepoch', 'localtime')) + d)/7) AS INT) 

有沒有人認爲他們可以給我一隻手? :)

非常感謝!

編輯

非常感謝你的幫助!

對於+ d問題(值'd'應該抵消多少)? 以下是我在測試後發現的,並且據我所知可以工作。我知道Sqllite使用0作爲星期日,1作爲星期一等,我知道我們正在分組和除以7(每週7天),但是有任何想法爲什麼這些將是'd'的正確值作爲偏移量?它現在似乎在工作。我看到模式去2,1,0,6,5,4,3但有點奇怪的順序去呃?

if (day == Sunday) //if your work week starts on Sunday, d=2 
    return 2 
else if (day == Monday) 
    return 1 
else if (day == Tuesday) 
    return 0 
else if (day == Wednesday) 
    return 6 
else if (day == Thursday) 
    return 5 
else if (day == Friday) 
    return 4 
else if (day == Saturday) 
    return 3 
+0

請提供一個[mcve],即適合定製的玩具數據庫的'.dump'。 – Yunnosch

+0

2,1,0,6,5,4,3並不奇怪。我們將數字0到6添加到Julian日數。當我們加0時,我們明顯地從星期二開始。所以當我們再增加一個時,我們就開始前一天,即星期一。這一直持續到星期三開始增加六點。把數字2,1,0,6,5,4,3寫成一個圓圈,你會看到它們都是連續的。如果我們加了7,那麼我們將再次從星期二開始,所以我們可以爲這些數字添加7(或14或21或-7等)。所以我們可以將9,8,7,6,5,4,3的數字相加或減去5,6,7,8,9,10,11。 –

回答

1

你非常接近。

  1. 您正在將d添加到日期時間。我不知道這是否實際上增加了幾天。我無法找到如果在SQLite中將日期時間添加到整數時會發生什麼情況。要保存它,請將日期添加到朱利安日。你不必先得到一個datetime和從該順便把儒略日,你可以做到一步到位:

    julianday(CreationDate/1000, 'unixepoch', 'localtime') + d 
    

    這是唯一真正的缺點我在查詢中看到。

  2. 儒略日是一個小數,例如2457907.5。當你調用/的分區時,你會得到一個分數結果。我看到你將這個結果轉換爲INT,但是我建議首先轉換爲INT,然後再分開,這將隱含地將其作爲整數除法。

    鑄造(儒略日(CreationDate/1000, 'unixepoch', '本地時間')+ d爲INT)/ 7

    這僅僅是爲了便於閱讀;我得到一個天數(2457907,而不是一些小數2457907.5)和整數除以7(例如2457907/7 = 351129)。

整個查詢:

SELECT 
    MIN(DATE(CreationDate/1000, 'unixepoch', 'localtime')) AS from_date, 
    MAX(DATE(CreationDate/1000, 'unixepoch', 'localtime')) AS till_date, 
    SUM(Amount) AS total 
FROM Sales 
WHERE UserID = x 
GROUP BY CAST(JULIANDAY(CreationDate/1000, 'unixepoch', 'localtime') + d as INT)/7 
ORDER BY SUM(Amount); 

from_datetill_date並不總是代表了整整七天,雖然,但只有工作日(例如,在一個星期從星期天到星期六,但只工作週一,週三和週五,它會顯示星期一和星期五的日期)。展示真實的一週需要稍微多些工作。 (我現在最好不要試試這個,因爲當你無法嘗試查詢的時候,這很容易就能休息一天。)

編輯:這是我的嘗試在開始和結束的日子周。當我們在浮點值上調用DATE時,該值被認爲是Julian日。 (也許它也可以用整數工作,但我無法確定從文檔中找到)

SELECT 
    DATE(CAST(CAST(JULIANDAY(CreationDate/1000, 'unixepoch', 'localtime') + d as INT)/7 as REAL)) AS from_date, 
    DATE(CAST(CAST(JULIANDAY(CreationDate/1000, 'unixepoch', 'localtime') + d as INT)/7 as REAL), '+6 day') AS till_date, 
    MIN(DATE(CreationDate/1000, 'unixepoch', 'localtime')) AS first_working_day, 
    MAX(DATE(CreationDate/1000, 'unixepoch', 'localtime')) AS last_working_day, 
    SUM(Amount) AS total 
FROM Sales 
WHERE UserID = x 
GROUP BY CAST(JULIANDAY(CreationDate/1000, 'unixepoch', 'localtime') + d as INT)/7 
ORDER BY SUM(Amount); 
+0

感謝您花時間閱讀本文!在開發者數據庫中,我正在使用這個數據庫,特定用戶在星期天5/28開始他的一天,並在星期六6/2(今天)結束。他每週只工作3天。當我運行上述查詢時,它似乎按照您的說法進行操作,並認爲這些日子已經工作,但不是整整一週。我玩+ d部分(+0,+ 1,...,+ 7),它肯定顯示不同的結果,但沒有正確彙總。我會一直玩這個,但感謝您的支持!如果您有任何其他建議並且不介意,我很樂意從您那裏獲得更多幫助。謝謝你,先生! – NullHypothesis

+0

這應該是正確的。整個星期*在這個查詢中被考慮(只有真正的星期開始和結束沒有顯示,你必須通過公式計算它們)。您可以編輯您的問題並在您認爲一個或多個結果行不正確的地方顯示結果(只有五行)。 –

+0

我已經添加了一個查詢,希望能正確說明這幾周的開始和結束。 –

-1

請嘗試以下執行查詢:

select 
    min(to_char(to_date(order_date,'mm/dd/yyyy'),'Day')) 
    keep(dense_rank first order by sum(sales) desc) best_day, 
    min(to_char(to_date(order_date,'mm/dd/yyyy'),'Day')) 
    keep(dense_rank last order by sum(sales) desc)worst_day 
from orders 
where userid=x 
group by to_char(to_date(order_date,'mm/dd/yyyy'),'Day'); 
+0

哇謝謝。 「(」:語法錯誤:所以它沒有運行,你的括號似乎與我匹配......在命名列後放置空格,甚至把你的'worst_day'和'best_day'但它仍然會拋出語法錯誤任何想法可能會發生什麼錯誤可能會發生(? – NullHypothesis

+0

是否有可能'保持'不是一個有效的SQLLITE語句? – NullHypothesis

+0

這是一個Oracle查詢。它不適用於SQLite 。而且它不會在甲骨文,因爲這個問題是因爲這些天是在這裏而不是在幾周內。 –