SQL-如何从同一列中的行值获取列(SQL Server 2016)

SQL-如何从同一列中的行值获取列(SQL Server 2016),sql,sql-server,Sql,Sql Server,我需要从一列的行值派生列 这是行数据 CustomerID Activity Date 10001 Active 2018-06-21 10001 Inactive 2018-06-25 10001 Active 2018-08-22 10001 Inactive 2018-10-06 这是我想要得到的结果: CustomerID ActiveDate InactiveDate 10001

我需要从一列的行值派生列

这是行数据

CustomerID  Activity    Date
10001       Active      2018-06-21
10001       Inactive    2018-06-25
10001       Active      2018-08-22
10001       Inactive    2018-10-06
这是我想要得到的结果:

CustomerID  ActiveDate      InactiveDate
10001       2018-06-21      2018-06-25
10001       2018-08-22      2018-10-06

请帮忙!谢谢

您可以尝试按CustomerID、Activity在子查询
组中创建行号,然后执行条件聚合函数

SELECT CustomerID,
       MAX(CASE WHEN Activity = 'Active' THEN Date END) ActiveDate,
       MAX(CASE WHEN Activity = 'Inactive' THEN Date END) InactiveDate
FROM (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY CustomerID,Activity ORDER BY Date ) rn
    FROM T
)t1
group by CustomerID,rn

你的逻辑有点不清楚。如果您想要下一个“非活动”日期:


请提供一份表格,您是否确定每个“活动”都有一个关联的“非活动”行,即紧跟其后的行(基于日期)?别想当然,去看看。不要只看在SSMS查询结果窗口中看到的第一组行(或“选择行”菜单的结果)。我看不出这里需要行号。如果不做行号,透视将只得到一行?或者你可以发布另一个解决方案吗?我期待着:)你是这个意思吗?啊,对不起,我刚刚意识到,我错过了这是同一个客户的整个过程。认为他们是两个不同的客户是的,问题是样本数据具有相同的
Customerid
,因此我需要为其创建一个行号:)
select CustomerID, date as active_date, inactive_date
from (select t.*,
             min(case when activity = 'Inactive' then date end) over (partition by CustomerID order by date desc) as inactive_date
      from t
     ) t
where activity = 'Active';