在新列(透视?)中显示行数据



我目前正在处理一个非常简单的查询,该查询可以拉出过去3年内访问过某个位置的人员列表。我的问题是,有很多人在这3年的时间里多次访问,所以这些人有多行归因于他们。我想做的是取一个字段,比如他们的访问日期,并将其显示在一列中,为每个额外的访问日期添加列,这样所有给定人员的数据都显示在一行中。在做了一些调查之后,听起来枢轴函数是我想要的,但是我在弄清楚如何将它应用到我的具体情况时遇到了一些麻烦。

这是我的查询:

SELECT DISTINCT
d.PersonID,
d.DOB,
d.Age as [Current Age],
DATEDIFF(YY,d.DOB,v.VisitDate) -                                        
CASE                                                                                             
WHEN DATEADD(YY,DATEDIFF(YY,d.DOB,v.VisitDate),d.DOB)   
> v.VisitDate THEN 1                                                                         
ELSE 0                                                                                          
END AS [Age at Visit],
v.VisitDate
FROM Demographic d JOIN Visit v ON d.PersonID = v.PersonID
WHERE VisitDate BETWEEN '01/01/2017' AND '12/31/2020'

当然,根据目前的编写方式,我最终得到的结果是这样的,每个访问者都有多行:

PersonID    ...    VisitDate
---------------------------------
1001        ...    04/06/2018
1001        ...    10/19/2019
1002        ...    07/20/2019
1003        ...    11/17/2017
1003        ...    02/01/2019
1003        ...    08/11/2020

这就是我想要的样子。我知道这不能解释我的访问年龄计算,但如果这意味着使这个工作,我可能会继续删除它:

PersonID    ...    VisitDate1    VisitDate2    VisitDate3
------------------------------------------------------------
1001        ...    04/06/2018    10/19/2019
1002        ...    07/20/2019
1003        ...    11/17/2017    02/01/2019    08/11/2020

考虑到我对这个数据的了解,任何给定的人应该在这个时间框架内只有最多4次访问,但是是否有一种方法可以自动添加额外的列,以防有人超过4?

看看下面是否适合你…通过使用动态sql

,可以动态添加更多的4次访问
CREATE TABLE #T (
ID int,
Visit Date
)
GO

INSERT #T
SELECT 1001, '04/06/2018' UNION
SELECT 1001, '10/19/2019' UNION
SELECT 1002, '07/20/2019' UNION
SELECT 1003, '11/17/2017' UNION
SELECT 1003, '02/01/2019' UNION
SELECT 1003, '08/11/2020' 
GO
SELECT * 
FROM 
(
SELECT * 
, CONCAT('Visit', ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Visit)) AS Visit_Cnt
FROM #T
) X
PIVOT
(
MAX(Visit) FOR Visit_Cnt IN([Visit1], [Visit2], [Visit3], [Visit4])
) A

最新更新