SQL Server将特定行转换为标头,将特定行转换为标头值
我在TOADSQL数据库表中有以下数据。让我们假设表名为tblSampleSQL 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
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