使用SQL填充缺少的字段

时间:2017-05-17 02:55:26

标签: sql database

这实际上与我之前提出的问题有关:Filling in the missing field for column in data frame in R

我有以下专栏:

saveProfile(profileId: string, token: string, profile: Profile): Observable<any> {

        var body = {
            "id": profile.id,
            "date_of_birth": profile.date_of_birth,
        }


        return this.http.put(UPDATE_EDIT_PROFILE, body, {
            headers: this.setHeaders(token)
        }).map((res: any) => res.json());

    }

我希望以格式

casenum  boxtype         numballs
  1         A               10
  1         B               20
  2         B               1
  2         C               2
  2         D               12
  3         A               10
  3         B               20
  3         C               1
  3         D               2
  .         .               .
  .         .               .
  .         .               .

我已经学会了如何在R.

中这样做

然后我想知道我是否可以在SQL中做类似的事情。

看起来查询应以&#34; group by casenum,boxtype,&#34;结束。但后来我不确定如何使用SQL制作这4个新列。

在SQL中有一种简单的方法吗?

2 个答案:

答案 0 :(得分:2)

这是一个透视查询。解决它的一般方法是使用条件聚合:

select casenum,
       sum(case when boxtype = 'A' then numballs else 0 end) as A,
       sum(case when boxtype = 'B' then numballs else 0 end) as B,
       sum(case when boxtype = 'C' then numballs else 0 end) as C,
       sum(case when boxtype = 'D' then numballs else 0 end) as D
from t
group by casenum;

答案 1 :(得分:2)

如果您使用的是SQL Server 2005+,则可以使用PIVOT函数将数据从行转换为列。

如果您的值(boxtype)已知,那么您将对查询进行硬编码:

select *
from 
(
  select casenum, boxtype, numballs
  from #table
) src
pivot
(
  sum(numballs)
  for week in ([A], [B], [C],[D])
) piv;

如果您需要动态生成boxtype,您的代码将是:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(boxtype) 
                    from table
                    group by boxtype
                    order by boxtype
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT casenum,' + @cols + ' from 
             (
                select casenum, boxtype, numballs
                from table
            ) x
            pivot 
            (
                sum(numballs)
                for boxtype in (' + @cols + ')
            ) p '

execute(@query);