我的PeopleInfo
表中有数据,其中有些人有多条记录,我试图将它们组合成一个视图的记录。
除PlanId
和PlanName
外,所有人数据几乎相同。所以:
| FirstName | LastName | SSN | PlanId | PlanName | Status | Price1 | Price2 |
|-----------|----------|-----------|--------|----------|-----------|---------|--------|
| John | Doe | 123456789 | 1 | Plan A | Primary | 9.00 | NULL |
|-----------|----------|-----------|--------|----------|-----------|---------|--------|
| John | Doe | 123456789 | 2 | Plan B | Secondary | NULL | 5.00 |
我想在我的视图中只有一条John Doe
记录,如下所示:
| FirstName | LastName | SSN | PlanId | PlanName | Status | Price1 | Price2 |
|-----------|----------|-----------|--------|----------|-----------|---------|--------|
| John | Doe | 123456789 | 1 | Plan A | Primary | 9.00 | 5.00 |
Primary
状态确定要显示哪个PlanId和PlanName。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
declare @t table ( FNAME varchar(10), LNAME varchar(10), SSN varchar(10), PLANID INT,PLANNAME varchar(10),stat varchar(10),Price1 decimal(18,2),Price2 decimal(18,2))
insert into @t (FNAME,LNAME,SSN,PLANID,PLANNAME,stat,Price1,Price2)values ('john','doe','12345',1,'PlanA','primary',9.00,NULL),('john','doe','12345',1,'PlanB','secondary',Null,8.00)
select
FNAME,
LNAME,
SSN,
MAX(PLANID)PLANID,
MIN(PLANNAME)PLANNAME,
MIN(stat)stat,
MIN(Price1)Price1,
MIN(Price2)Price2 from @t
GROUP BY FNAME,LNAME,SSN
答案 1 :(得分:0)
(我还不能添加评论,所以请回答。)
这里唯一令我困扰的是我也在确定哪个PlanId和PlanName因为它们不同而且我想根据两个记录的Status字段显示一个特定的PlanId和PlanName。
然后你甚至不需要GROUP
。这会简单得多。只需SELECT WHERE 'Primary' = PlanName
。假设(A)每个用户总会有这个PlanName,(B)你很乐意忽略所有其他用户。
P.S。如果您只使用主要和次要PlanNames,您可能希望将列更改为名为isPrimaryPlan的bit
,其中1表示true,0表示false。但是,如果您稍后可能引入例如铜牌和安慰奖计划,那么您将需要保留更多变量的数据类型。也许将计划存储在一个单独的表中并且有一个int FOREIGN KEY
...我可以继续!
答案 2 :(得分:0)
好的,我睡了之后回来了,这让我的大脑略有改善,
首先,让记录反映出我不喜欢这里的数据库设计。人员和计划应该是单独的表格,通过外键链接 - 通过第三个表格,例如PeoplePlans。这让我想到另一点:这里的人没有primary key
(至少不是你指定的)。因此,在编写下面的内容时,我必须选择SSN,假设它始终存在且unique
。
无论如何,这样的应该工作,但需要注意的是我不会复制数据库结构来测试它。
select
FirstName,
LastName,
SSN,
PlanId,
PlanName,
Status,
_ca._sum_Price1,
_ca._sum_Price2
from
PeopleInfo as _Primary
cross apply (
select
sum(Price1) as _sum_Price1,
sum(Price2) as _sum_Price2
from
PeopleInfo
where
_Primary.SSN = SSN
) as _ca
where
'Primary' = Status;
此SELECT
所有具有主要状态的人员,以便获取这些行。然后它CROSS APPLY
是他们的主要行和任何其他行,并采用总计价格。
希望这是有道理的。如果没有,除了良好的关系数据库设计之外,您还必须阅读CROSS APPLY
。 ; - )