将行数据压缩到视图中

时间:2015-07-13 16:47:30

标签: sql-server

我的PeopleInfo表中有数据,其中有些人有多条记录,我试图将它们组合成一个视图的记录。

PlanIdPlanName外,所有人数据几乎相同。所以:

| 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。任何人都可以帮我解决这个问题吗?

3 个答案:

答案 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。 ; - )