2016-08-23 121 views
1

長時間潛伏者 - 第一次海報。垂直到水平表與月分組

我是新來的Access和有一個數據表,我試圖通過查詢操縱。

當前視圖:

ID | $Value | Month 
1 | 184 | 10/1/2012  
1 | 186 | 11/1/2012  
1 | 176 | 12/1/2012  
1 | 183 | 1/1/2013  
1 | 192 | 2/1/2013  
1 | 201 | 3/1/2013  
1 | 183 | 4/1/2013  
1 | 179 | 5/1/2013  
1 | 177 | 6/1/2013  
1 | 135 | 7/1/2013  
1 | 202 | 8/1/2013  
1 | 188 | 9/1/2013  
2 | 258 | 5/1/2013  
2 | 126 | 6/1/2013  
2 | 236 | 7/1/2013  
2 | 367 | 8/1/2013  
2 | 450 | 9/1/2013  
2 | 186 | 10/1/2013  
2 | 248 | 11/1/2013  
2 | 264 | 12/1/2013  
2 | 257 | 1/1/2014  
2 | 264 | 2/1/2014  
2 | 138 | 3/1/2014  
2 | 264 | 4/1/2014 

期望的終結查看:

ID | Month 1 | Month 2 | Month 3 | Month 4 | Month 5 | ... | Month 12  
1 | 184  | 186  | 176  | 183  | 192  | ... | 188  
2 | 258  | 126  | 236  | 367  | 450  | ... | 264 

我試圖在轉訪問數據,以便有每個ID只有一行並將月份分組(總是標記爲「月1」,「月2」等)。我只想看12個月的列(每個月和每年不是一列)。因此,在上面的示例ID 1中,儘管每個ID的月份和年份不同,但是月1是184,ID 2,月1是258。

任何指導/幫助非常感謝。

+0

我看不到你的圖片,就像在辦公室我們很多。所以我無法回答。代替粘貼原始文本會更好。你是可能尋找一個PIVOT,檢查我最近的答案[這裏](http://stackoverflow.com/questions/39075418/how-to-get-result-populated-month-wise-using-ms-access-query/ 39076318#39076318),它可能有幫助而且我猜你錯誤地標記了你的問題,它應該是'sql'而不是'mysql',如果是的話請修改並修改標記。 –

+0

ms訪問具有內置的數據透視表功能。你試過了嗎? – Shadow

+0

@Thomas G,謝謝我根據你的建議進行了編輯,並且正在研究你以前的答案。 –

回答

0

如已提出 - 交叉表(支點)查詢將在這裏工作:

TRANSFORM Sum(sValue) AS SumOfsValue 
SELECT  ID 
FROM  Table1 
GROUP  BY ID 
PIVOT  "Mo" & Month([dMonth]) 

是您的「期望的終結觀」是否正確?
例如你在第12個月有188個ID 1 - 這不應該是176嗎?

+0

謝謝!這絕對能讓我走上正軌。並且是的,第12個月的ID 1應爲188.我不打算將月份標記爲Jan = 1,Feb = 2 ...我想要輸入的第一個月始終是月份1 –

+0

How你記錄哪個月有一個值先輸入?在數據庫中,表中記錄的順序是完全不相關的,因此您不能使用第1,第2,第3,...行作爲輸入順序。 –

+0

也許我不是很正確地解釋。數據庫詢問用戶完成日期。一旦輸入該日期,數據庫將填入接下來的11個月(總共12個月)的值。用戶輸入的完成日期是我期望的第1個月,接下來的11個月將依次進行。 –

1

我對圖形查詢編輯器界面不太熟悉,但是您絕對可以在SQL中使用TRANSFORM和PIVOT功能以及month()函數執行此操作。事實上,在圖形界面中,您可能會錯過month()函數。我相信,SQL版本是這樣的:

TRANSFORM Max([Current View].[$Value]) 
SELECT [Current View].[ID] 
from [Current View] inner join 
    (select tbl1.[ID], min(cdate(tbl1.[Month])) as minDate 
     from [Current View] as tbl1 
     group by tbl1.[ID]) as earliestDate on [Current View].[ID] = earliestDate.[ID] 
Where datediff("m", earliestDate.minDate, [Current View].[Month])<=12 
group by [Current View].[ID] 
PIVOT (datediff("m", earliestDate.minDate, [Current View].[Month]) +1) 
; 

編輯:添加邏輯來定義基於每個ID起始月個月,並限制到只有12個月之後。

+0

感謝大家對此的承諾,並對Access/sql的全新使用表示歉意。 @TP這看起來不錯,但我在JOIN操作中出現語法錯誤,有什麼想法可能會導致這種情況? –

+0

它看起來像我在「最早」一次拋棄了「r」。我編輯過它。 – TPhe

1

考慮到您每個ID和月份只有一個值,請使用FIRST聚合函數,而不是我的研究人員提議的SUMMAX

TRANSFORM FIRST([$Value]) 
SELECT [ID] 
FROM [Current View] 
GROUP BY [ID] 
PIVOT "Mo" & Month([Month]) 

如果你想所有年份和月份(YYYY-MM)

TRANSFORM FIRST([$Value]) 
SELECT [ID] 
FROM [Current View] 
GROUP BY [ID] 
PIVOT (Year([Month]) & '-' & Month([Month])) 
+0

如果只有1個值,那麼肯定'FIRST','SUM'和'MAX'都會返回相同的值?我使用了'SUM',因此不會排除任何數字 - 如果一個月有兩個條目,他們將被添加到一起。如果使用「FIRST」或「MAX」,它將忽略爲該月輸入的任何其他值。 –

+0

是的,他們確實會返回相同的值。這裏使用FIRST純粹是合乎邏輯的:)但是如果數據問題與月份/ ID重複,FIRST或MAX將確保只返回一個值。不確定在這種情況下是否有任何意義。 –

+0

我認爲這個想法通常是first()比max()或sum()更有效,即使它會給出相同的結果。我買了這個,雖然在這種情況下差異會很小。正如@ DarrenBartrup-Cook指出的那樣,海報必須真正考慮這一點,因爲如果在同一個id和月份碰巧有多個禮物,first()或max()會排除值。 – TPhe