如何在 SQL 中按年份排列输出?

How to arrange output by months pivoted by year in SQL?

我有一个 table 付款称为 PYMT,如果可能的话,我正在尝试使用 PIVOT 来对输出进行某种安排,并且对如何执行此操作感到困惑。在 table 中是 pymt_amount 和 pymt_date(其他列也是,但不是必需的)。我希望看到输出如下所示:

PayMonth    2007        2008        2009        2010        2011
1           26044.12    82663.79    83583.17    35963.49    100865.94
2           60145.61    35245.06    19173.08    14417.98    21502.71
3           68138.88    88670.16    85319.66    40850.39    31595.43
4           228835.04   215258.84   157905.56   136551.46   166027.30
5           395877.88   348307.58   348506.09   363460.24   298488.22
6           618013.05   662869.88   522233.48   472174.95   385879.94
7           557751.27   363659.66   305363.68   304606.98   349173.75
8           355639.91   173107.60   266235.54   147731.54   251878.49
9           131440.63   173338.90   133869.36   140035.13   109595.83
10          168148.90   127356.25   114818.69   119082.52   139201.50
11          139543.35   138151.22   128667.58   137351.77   107807.27
12          142286.06   136670.64   116980.04   69609.22    85670.84

要获得付款总额的第一列很容易 - 它在我无法弄清楚的其他年份中这样做 - 我知道如何做一个基本的 PIVOT table。

前两列的查询是

SELECT        DATEPART(MM, pymt_Date) AS PayMonth, SUM(pymt_Amount) AS [2007]
FROM            PYMT
GROUP BY DATEPART(MM, pymt_Date) , DATEPART(YY, pymt_Date)
HAVING        (DATEPART(YY, pymt_Date) = 2007)
ORDER BY PayMonth

如何添加其他年份(每个 payMonth 是当月所有付款的总和),但我不希望按月进行透视(只是输出中显示的按月显示的年份)

我可以 运行 每个月在游标中单独查询一次 这是一个示例,但显示了当年的总计(但需要按月分隔)

SELECT * FROM
(SELECT DATEPART(yy, pymt_Date) AS PayYear, pymt_Amount
FROM PYMT 
) tbl1
PIVOT
(SUM(pymt_Amount)
FOR
PayYear in ([2007],[2008],[2009],[2010],[2011])
) tbl2

产生

2007        2008        2009        2010        2011
2891864.70  2545299.58  2282655.93  1981835.67  2047687.22

如您所见 - 这不是按月行细分的

有什么想法吗?

您在 tbl1 查询中错过了这个 DATEPART(month, pymt_Date) AS PayMonth

完整的查询应该是

SELECT * 
FROM
(
    SELECT DATEPART(year, pymt_Date) AS PayYear, 
           DATEPART(month, pymt_Date) AS PayMonth,
           pymt_Amount
    FROM   PYMT 
) tbl1
PIVOT
(
    SUM(pymt_Amount)
    FOR PayYear in ([2007],[2008],[2009],[2010],[2011])
) tbl2