gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:21:35 24 4
gpt4 key购买 nike

我查看了以下相关帖子:

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

编辑 (4/2/2014):我决定我希望状态 #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 阅读的人数计数。

在 State #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

不幸的是,我不知道从哪里开始。

最佳答案

我认为你有两个选择。

传统的枢轴

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

关于sql-server - 如何在 Access 2010 中使用 TSQL 执行以下多层透视?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22818128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com