这实际上与我之前提出的问题有关: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中有一种简单的方法吗?
答案 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);