2013-03-07 189 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