如何在 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
我有一个 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