假设我们有下表:
ID Type Amount
0001 A 10
0001 B 20
0001 C 30
0002 A 15
0002 C 20
0003 B 40
...
期望的结果将是:
ID Type A Type B Type C
0001 10 20 30
我可以执行以下操作,以便将多行合并为一行。
SELECT ID, A, B, C
FROM MyTable
PIVOT
(
SUM(amount)
FOR Type IN (A, B, C)
) AS P
然而,我的表比前一个表更复杂。 假设我的表格如下:
ID Type Total_Amount Average_Amount
0001 A 10 0.5
0001 B 20 0.7
0001 C 30 0.9
所以我的问题是如何产生以下结果?
ID TypeA_total TypeB_total TypeC_total TypeA_avg TypeB_avg TypeC_avg
0001 10 20 30 0.5 0.7 0.9
更新
类型数量是固定的。这意味着只有A,B和C型。 有些ID可能只有一种类型。有些可能有3种类型。其他一些可能有两种类型。
Total_amount和Average_amount在原始表中给出。我不需要做计算。
以下是您可以使用该表格的链接: http://sqlfiddle.com/#!3/4e6835
答案 0 :(得分:1)
您需要在 <div class="tab-content">
<div id="mastery1" class="tab-pane fade">
<h1>Show the last 10 Games</h1>
<div>
<!-- more tab content -->
</div>
unpivot
数据
pivoting
注意:如果没有。 WITH cte
AS (SELECT id,
value,
col_name
FROM yourtable
CROSS apply( VALUES (total_amount,'Type' + type + '_Total'),
(average_amount,'Type' + type + '_Avg') )
CS (value, col_name))
SELECT *
FROM cte
PIVOT (Max(value)
FOR col_name IN([TypeA_total],[TypeB_total],[TypeC_total],
[TypeA_avg],[TypeB_avg],[TypeC_avg]))pv
未知,那么您需要使用types
答案 1 :(得分:1)
这是另一种方法。这是使用交叉表查询而不是PIVOT。我发现语法不那么钝,甚至比使用PIVOT还略有性能提升。
if OBJECT_ID('tempdb..#something') is not null
drop table #something
create table #something
(
ID char(4)
, SomeType char(1)
, Amount int
, AverageAmount decimal(9, 2)
)
insert #something
select '0001', 'A', 10, .5 union all
select '0001', 'B', 20, .7 union all
select '0001', 'C', 30, .9;
with OrderedResults as
(
select *
, ROW_NUMBER() over(partition by ID order by SomeType) as RowNum
from #something
)
select ID
, MAX(Case when RowNum = 1 then SomeType end) as TypeA
, MAX(Case when RowNum = 1 then AverageAmount end) as AverageA
, MAX(Case when RowNum = 2 then SomeType end) as TypeB
, MAX(Case when RowNum = 2 then AverageAmount end) as AverageB
, MAX(Case when RowNum = 3 then SomeType end) as TypeC
, MAX(Case when RowNum = 3 then AverageAmount end) as AverageC
from OrderedResults
group by ID