2013-03-07 185 views
0

這是與我以前的帖子在my post here但與不同的問題有關的另一個問題。選定年份的交叉表查詢作爲列標題

在我以前的文章中,我問如何創建一個交叉表查詢,該查詢將輸出基於4年版權年份的列。答案非常好,但現在我面臨着另一個挑戰。

需要明確的是這裏的一對錶中的數據:

ID  CallNo  CopyrightYear 
1  AH   2000 
2  AB   2000 
3  BC   2001 
4  AH   2000 
5  ZA   2005 
6  BC   2001 
7  AP   2003 
10  ZA   2006 
11  DA   2009 
12  DA   2010 
13  RA   1999 
14  WE   1997 
15  HK   1996 
16  AG   2011 

基於原來職位的sql語句應該是這樣的:

TRANSFORM Count(tab1.ID) AS CountOfID 
SELECT tab1.CallNo, Count(tab1.ID) AS [Total Of ID] 
FROM table1 AS tab1 
GROUP BY tab1.CallNo 
PIVOT CStr(Int(([CopyrightYear])/5)*5)+' to '+CStr(Int(([CopyrightYear])/5)*5+4); 

,輸出是:

CallNo 1995 to 1999 2000 to 2004 2005 to 2009 2010 to 2014 
AB       1  
AG               1 
AH       2  
AP       1  
BC       2  
DA           1    1 
HK   1   
RA   1   
WE   1   
ZA           2 

我的問題是關於如何結合1999年以下版權年的所有結果0.1一個新列的輸出,我想是這樣的:

CallNo 1999 below  2000 to 2004 2005 to 2009 2010 above 
AB       1  
AG               1 
AH       2  
AP       1  
BC       2  
DA           1    1 
HK   1   
RA   1   
WE   1   
ZA           2 

這意味着,如果有版權年份是1999年低於1980年一樣,將列「1999年低於」下計算。與2010年相同,如果2014年,2016年甚至2020年等版權年份的價值將計入「2010年以上」欄中。

回答

3

你應該嘗試用規定的轉置轉換是比較簡單的,但是可能需要更長時間的數據別的東西:

創建一個表像和做一個轉變:

+--------------+--------+------------+ 
| NUMOFRECORDS | CALLNO | DATERANGE | 
+--------------+--------+------------+ 
|   1 | AB  | 2000 2004 | 
|   1 | AG  | 2010 above | 
|   1 | AP  | 2000 2004 | 
|   1 | DA  | 2005 2009 | 
|   1 | DA  | 2010 above | 
|   1 | HK  | 1999 Below | 
|   1 | RA  | 1999 Below | 
|   1 | WE  | 1999 Below | 
|   2 | AH  | 2000 2004 | 
|   2 | BC  | 2000 2004 | 
|   2 | ZA  | 2005 2009 | 
+--------------+--------+------------+ 

創建使用聯合查詢像這樣的表:

SELECT count(ID) AS NumOfRecords, CallNo, '1999 Below' AS DateRange 
FROM table1 
WHERE CopyrightYear <= DateValue('1-1-1999') 
GROUP BY CallNo; 

UNION 
SELECT count(ID) as NumOfRecords, CallNo, '2000 2004' as DateRange 
FROM table1 
WHERE CopyrightYear between DateValue('1-1-2000') and DateValue('1-1-2004') 
GROUP BY CallNo 

UNION 
SELECT count(ID) as NumOfRecords, CallNo, '2005 2009' as DateRange 
FROM table1 
WHERE CopyrightYear between DateValue('1-1-2005') and DateValue('1-1-2009') 
GROUP BY CallNo 

UNION 
SELECT count(ID) as NumOfRecords, CallNo, '2010 above' as DateRange 
FROM table1 
WHERE CopyrightYear >= DateValue('1-1-2010') 
GROUP BY CallNo 

,對於您查詢交叉表查詢那樣使用:

TRANSFORM Sum(Query1.NumOfRecords) AS SumOfNumOfRecords 
SELECT Query1.CallNo 
FROM Query1 
GROUP BY Query1.CallNo 
PIVOT Query1.DateRange; 

測試在MS-Access 2010中...

+0

感謝,我會嘗試。 – jaypabs 2013-03-07 15:51:24

+0

@jaypabs嘿,我剛回到家,發現我的訪問安裝,所以我玩了一下,並得到了你的完整答案。在嘗試交叉錶轉換之前準備數據始終是個好主意。 – Mortalus 2013-03-07 17:36:28

+0

非常感謝。 – jaypabs 2013-03-08 01:23:48