如何在Access 2010中使用TSQL执行以下多层透视?

时间:2014-04-02 16:56:40

标签: sql-server tsql ms-access count pivot

我查看了以下相关帖子:

How to create a PivotTable in Transact/SQL?

SQL Server query - Selecting COUNT(*) with DISTINCT

SQL query to get field value distribution

欲望:数据从状态#1变为状态#2。

数据:此数据是在某个地方记录某人(由其PersonID标识)执行某项活动的年份的集合。

我的数据目前看起来如下:

State #1

Row | Year | PlaceID | ActivityID | PersonID

001   2011    Park       Read         201a                
002   2011   Library     Read         202b  
003   2012   Library     Read         202b
004   2013   Library     Read         202b
005   2013   Museum      Read         202b
006   2011    Park       Read         203c
006   2010   Library     Read         203c
007   2012   Library     Read         204d 
008   2014   Library     Read         204d

编辑(2014年4月2日):我认为我希望状态#2只是不同的计数。

我希望我的数据看起来像:

State #2               

Row |  PlaceID |  Column1 | Column2 | Column3 

001      Park        2           
002     Library      1         1         1
003     Museum       1

其中:

第1列:参加PlaceID仅在一年内阅读的人数。

第2栏:参加PlaceID在两年内阅读的人数。

第3栏:参加PlaceID阅读三年不同年份的人数。

在状态#2架构中,每个行(地点)不能将一个人计入多个列。如果某人在2010年,2011年,2012年的特定地点阅读,则他们仅出现在第001行,第3列中。但是,该人可以出现在其他行中,但只能出现在该行的一列中。

我的方法(如果我做错了,请纠正我):

我认为第一步是提取每个人参加该地点以执行感兴趣活动的年数的不同计数(如果不正确,请纠正我的方法)。

因此,这就是我使用T-SQL的地方:

SELECT 
PlaceID
,PersonID
,[ActivityID]
,COUNT(DISTINCT [Year]) AS UNIQUE_YEAR_COUNT
FROM (
SELECT
     Year
    ,PlaceID
    ,ActivityID
    ,PersonID
FROM [my].[linkeddatabasetable]
WHERE ActivityID = 'Read') t1
GROUP BY
    PlaceID
    ,PersonID
    ,[ActivityID]
ORDER BY 1,2

不幸的是,我不知道从哪里拿走它。

2 个答案:

答案 0 :(得分:3)

我认为你有两种选择。

传统的支点

select placeID, 
  , Column1 = [1]
  , Column2 = [2]
  , Column3 = [3]
from 
(
SELECT 
    PlaceID
    ,COUNT(DISTINCT [Yearvalue]) AS UNIQUE_YEAR_COUNT
    FROM (
    SELECT
         yearValue
        ,PlaceID
        ,ActivityID
        ,PersonID
    FROM #SO
    WHERE ActivityID = 'Read') t1
    GROUP BY
        PlaceID
        ,PersonID
        ,[ActivityID]) up
pivot (count(UNIQUE_YEAR_COUNT) for UNIQUE_YEAR_COUNT in ([1],[2],[3]) ) as pvt

或作为风格转轴的情况。

select I.PlaceID
    , Column1 = count(case when UNIQUE_YEAR_COUNT = 1 then PersonID else null end)
    , Column2 = count(case when UNIQUE_YEAR_COUNT = 2 then PersonID else null end)
    , Column3 = count(case when UNIQUE_YEAR_COUNT = 3 then PersonID else null end)
from (
    SELECT 
        PlaceID
        , PersonID
        ,COUNT(DISTINCT [Yearvalue]) AS UNIQUE_YEAR_COUNT
    FROM (
    SELECT
         yearValue
        ,PlaceID
        ,ActivityID
        ,PersonID
    FROM #SO
    WHERE ActivityID = 'Read') t1
    GROUP BY
        PlaceID
        ,PersonID
        ,[ActivityID]) I
group by I.PlaceID

答案 1 :(得分:1)

由于您在Access中,我认为使用聚合函数可以完成工作。

尝试使用DCOUNT()以http://office.microsoft.com/en-us/access-help/dcount-function-HA001228817.aspx开头。

将您的count()替换为dcount(“year”,“linkeddatabasetable”,“placeid =”& [placeid])