SQL Server将特定行转换为标头,将特定行转换为标头值

SQL Server将特定行转换为标头,将特定行转换为标头值,sql,sql-server,toad,Sql,Sql Server,Toad,我在TOADSQL数据库表中有以下数据。让我们假设表名为tblSample ID NAME COVERMONTH EFFECTIVEDATE TERMDATE PAIDAMOUNT EARNEDAMOUNT 1546871 SAMPLE1 202001 1-Aug-14 31-Dec-99 5122.12 5111.02 1065418 SAMPLE2 202001 1-Jan-15 31-Dec-99

我在TOADSQL数据库表中有以下数据。让我们假设表名为tblSample

ID     NAME   COVERMONTH  EFFECTIVEDATE  TERMDATE  PAIDAMOUNT  EARNEDAMOUNT
1546871 SAMPLE1    202001   1-Aug-14     31-Dec-99       5122.12     5111.02  
1065418 SAMPLE2    202001   1-Jan-15     31-Dec-99           0           0
1546871 SAMPLE1    202002   1-Aug-14     31-Dec-99        5122.12     5111.02  
1065418 SAMPLE2    202002   1-Jan-15     31-Dec-99        3211.21     3211.21
在上面的数据中,我有两个项目ID的数据。在实际情况下,项目ID的计数将是动态的

注意:COVERMONTH将是动态值。它们每月都在变化

所需输出如下所示

ID    NAME    EFFECTIVEDATE    TERMDATE    202001    202002   202003 --- all the rows are completed
1546871 SAMPLE1   1-Aug-14      31-Dec-99  5122.12   5111.02   5122.12 ------
1065418 SAMPLE2   1-Jan-15      31-Dec-99      0     3211.21   3012.12 ------
简单地说,我需要将COVERMONTH作为列标题,将EARNEDAMOUNT作为特定ID的行值

在示例表ID中,NAME、EFFECTIVEDATE和TERMDATE对于特定ID是相同的,但是PAIDAMOUNT和EARNEDAMOUNT随月份而变化


对于获得最终结果的任何帮助,我们将不胜感激。

如果您知道需要的月份,您可以使用条件聚合:

select ID, NAME, EFFECTIVEDATE, TERMDATE,
       sum(case when COVERMONTH = 202001 then EARNEDAMOUNT end) as ea_202001,
       sum(case when COVERMONTH = 202002 then EARNEDAMOUNT end) as ea_202002,
       . . .
from t
group by ID, NAME, EFFECTIVEDATE, TERMDATE
试试这个:

@COVERMONTH1和@COVERMONTH2为输入


这看起来就像一个(动态)枢轴。你试过什么,为什么不奏效?告诉您如何执行此操作的答案有什么问题?@Dale K..我正在使用Toad for Sql Server。@Larnu。。我得到了temp表的所有惟一ID,然后使用游标在where contion中使用惟一ID遍历实际表。但我在使用游标时失败了。既然COVERMONTH的值每个月都会更改,我如何动态传递COVERMONTH呢。我不能硬编码它们。请建议。@shyam。你的问题不清楚封面月份是否需要动态——这就是为什么我有“如果你知道你想要的月份”。要处理动态列,需要编写动态SQL。这要复杂得多,而且依赖于数据库。
Create Proc usp_myproject
     @COVERMONTH1 int
    ,@COVERMONTH2 int
AS
    Set nocount on

    Select ID, [NAME], EFFECTIVEDATE, TERMDATE,
           sum(case when COVERMONTH = @COVERMONTH1 then EARNEDAMOUNT end) as COVERMONTH_One,
           sum(case when COVERMONTH = @COVERMONTH2 then EARNEDAMOUNT end) as COVERMONTH_Two
    From t
    Group by ID, NAME, EFFECTIVEDATE, TERMDATE