SQL尝试按ID分组并根据类别保留变量

时间:2016-03-14 17:17:28

标签: sql-server

我不知道如何解释这一点,但我有一个带有ID变量PassengerID的数据集,然后是时间变量“时间”和每个交易的每个交易的类别变量“ItemA”或“ItemB”

在这种情况下,我为ItemA和ItemB创建了虚拟变量,两行都有变量Time

基本上我想把乘客分组在一起,所以我知道乘客1在TimeA买了ItemA,在TimeB买了ItemB。

我的第一个想法是创建TimeA和TimeB变量

select (case when ItemA=1 then Time) end as TimevarA,
       (case when ItemB=1 then Time) end as TimevarB

试图找出如何

group by PassengerID

在ItemB

时,我可以为ItemA设置Time = TimeA,为TimeB设置Time = TimeB

数据看起来像

DECLARE @t TABLE(
passengerID varchar(100),
itemA VARCHAR(100),
itemB VARCHAR(100),
timevar date
)
insert into @t values
('1','1','0','2015-01-01'),
('1','0','1','2015-02-01')

虽然目标是

DECLARE @goal TABLE(
passengerID varchar(100),
itemA VARCHAR(100),
itemB VARCHAR(100),
timevarA date,
timevarB date
)
insert into @goal values
('1','1','1','2015-01-01','2015-02-01')

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

我认为您正在寻找条件聚合。

select PassengerID,
       max(case when ItemA = 1 then Time end) as TimevarA,
       max(case when ItemB = 1 then Time end) as TimevarB
from @t
group by PassengerID;

答案 1 :(得分:0)

也许你应该重塑数据。即:

scope : true

答案 2 :(得分:0)

伙计,如果你有像

这样的数据
('1','1','0','2015-01-01'), ('1','0','1','2015-02-01')

您可以获得"目标"像下面的SELECT一样使用

SELECT PassengerID,
       max(itemA) itemA,
       max(itemB) itemB,
       max(case when ItemA = 1 then Time end) as timevarA,
       max(case when ItemB = 1 then Time end) as timevarB
FROM @t
GROUP BY PassengerID;