0

这是另一个与我之前的帖子相关的问题,有不同的问题。

在我之前的帖子中,我询问了如何创建一个交叉表查询,该查询将根据版权年份的 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 年和高于 2010 年的所有结果。我想要的新列输出是这样的:

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年以上”列。

4

1 回答 1

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 上测试...

于 2013-03-07T15:22:52.157 回答