我查看了以下相关帖子:
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
不幸的是,我不知道从哪里拿走它。
答案 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])