在SQL中进行透视组合两列

时间:2016-05-23 12:43:38

标签: sql-server

如果有人可以提供帮助,这可以更好地解释我想要做的事情。

这是查询。

select  sb.col_nm  + '.' + sb.col_r_nm as 'Combined', mt.vlu_cd, at.tmplt_id
from templ_t at
inner join aud_bat_t b on b.tmp_id = at.tmp_id 
inner join stats_dtl_t mt on mt.batch_id = b.batch_id
inner join lg_clmn_t sb on sb.lg_col_id = mt.lg_col_id
where at.tmplt_id = 6
order by sb.col_nm  + '.' + sb.col_r_nm, mt.vlu_cd, at.tmplt_id

所以我有前两行的组合,以及查询现在返回的是什么。

**Combined           vlu_cd      tmplt_id**
prc_crf.premium      4567          6
prc_crf.premium      8574          6
prc_crf.premium      4789          6
prc_crf.sales        7777          6
prc_crf.sales        5487          6
prc_crf.sales        8888          6
prc_crf.sales        9874          6
lrt_lr_premium       7755          6
lrt_lr_premium       4874          6
lrt_lr_premium       9999          6
ptr_pr_sales         5555          6
ptr_pr_sales         3333          6
ptr_pr_sales         6523          6
ptr_pr_sales         1489          6

所以我想要的是当我转动数据时只是显示以下内容,其中名为Combined的列中的所有行都成为列,其中每行列在行中的vlu_cd。

任何人都可以帮助查询数据透视这些数据,而不是必须手动输入它们。

对不起,如果这是令人困惑的我是初学者所以,如果我不清楚,如果你问我可以尝试更好地解释它。

所以从上面的结果来看,如果我可以透视这样的数据,那么在透视时我不必手动输入每一行。

prc_crf.premium   prc_crf.sales   lrt_lr_premium   ptr_pr_sales
4567                7777                7755            3333        
8574                5487                4874            6523
4789                8888                9999            1489
                    9874                5555

2 个答案:

答案 0 :(得分:2)

SELECT SUM(CASE WHEN stored_col_b.col_nm = 'jobs_t' AND stored_col_b.col_r_nm = 'job_id' THEN value_col_b.vlu_cd ELSE 0 END) AS [jobs_t.job_id]
      ,SUM(CASE WHEN stored_col_b.col_nm = 'road_t' AND stored_col_b.col_r_nm = 'road_id' THEN value_col_b.vlu_cd ELSE 0 END) AS [road_t.road_id]
FROM stored_col_b
     INNER JOIN value_col_b
         ON value_col_b.col_id = stored_col_b.col_id 

在需要时添加更多列

答案 1 :(得分:1)

这是一个用于转动数据的小sp

ALTER PROCEDURE [dbo].[prc-Pivot] (@Select varchar(1000),
    @PvotCol varchar(100),
    @Summaries varchar(100),
    @GroupBy varchar(100),
    @OtherCols varchar(100) = Null)
AS

Set NoCount On
Set Ansi_Warnings Off

Declare @Vals varchar(max);
Set @Vals = ''
Set @OtherCols= IsNull(', ' + @OtherCols,'')
Create Table #Temp  (Pvot varchar(100))
Insert Into #temp
Exec ('Select Distinct Convert(varchar(100),' + @PvotCol + ') as Pvot FROM (' + @Select + ') A')
Select @Vals = @Vals + ', ' + Replace(Replace(@Summaries,'(','(CASE WHEN ' + @PvotCol + '=''' + Pvot +  ''' THEN '),')[', ' END) As [' + Pvot ) From #Temp Order by Pvot
Drop Table #Temp
Exec ('Select ' + @GroupBy + @OtherCols + @Vals + ' From (' + @Select + ') A Group By ' + @GroupBy + ' Order by 1,2')
Set NoCount Off
Set Ansi_Warnings on

随意玩选项:

Exec [prc-Pivot] 'Select grpby=1,colstr=col_nm+''.''+col_r_nm,vlu_cd from aaa','colstr','sum(vlu_cd)[]','grpby'

Retrurns

grpby   jobs_t.job_id   road_t.road_id
1       789             468