Sql 通过聚合实现Pivot和更多功能
有谁能帮我写这个查询吗 我有一张这样的桌子:Sql 通过聚合实现Pivot和更多功能,sql,sql-server,pivot,Sql,Sql Server,Pivot,有谁能帮我写这个查询吗 我有一张这样的桌子: YR MON SM SG SP CUS NPS GWT 2016 1 5 9 6543 9020418 47115.94 1 2016 2 5 9 6543 9020418 45010.28 1 2016 3 5 9 6543 9020418 91956.52 1 2016 4 5 9 6543 9020418 92003
YR MON SM SG SP CUS NPS GWT
2016 1 5 9 6543 9020418 47115.94 1
2016 2 5 9 6543 9020418 45010.28 1
2016 3 5 9 6543 9020418 91956.52 1
2016 4 5 9 6543 9020418 92003.14 1
2016 5 5 9 6543 9020418 109858.89 1
2016 6 5 9 6543 9020418 39979.23 -0.151471243
2016 7 5 9 6543 9020418 72114.07 0.602168882
2016 8 5 9 6543 9020418 70135.41 -0.237298127
输出如下所示
SM SG SP CUS YEAR JAN FEB MAR APR MAY JUN JUL AUG **FY**
5 9 6543 9020418 2016 47115.94 45010.28 91956.52 92003.14 109858.89 39979.23 72114.07 70135.41 568173.48
SM SG SP CUS YEAR JAN FEB MAR APR MAY JUN JUL AUG **FG**
5 9 6543 9020418 2016 1 1 1 1 1 -0.151471243 0.602168882 -0.237298127 0.651
这里的
FY
是NPS
的总和,FG
是GWT
的平均值,您可以尝试通过以下方式解决:
-- Create demo data
CREATE TABLE #temp(YR int,MON int,SM int,SG int,SP int,CUS int,NPS float,GWT float)
INSERT INTO #temp(YR,MON,SM,SG,SP,CUS,NPS,GWT)
VALUES (2016,1,5,9,6543,9020418,47115.94,1),
(2016,2,5,9,6543,9020418,45010.28,1),
(2016,3,5,9,6543,9020418,91956.52,1),
(2016,4,5,9,6543,9020418,92003.14,1),
(2016,5,5,9,6543,9020418,109858.89,1),
(2016,6,5,9,6543,9020418,39979.23,-0.151471243),
(2016,7,5,9,6543,9020418,72114.07,0.602168882),
(2016,8,5,9,6543,9020418,70135.41,-0.237298127)
-- Your Part
-- FY
SELECT pvt.YR, pvt.sm, pvt.sg, pvt.sp, pvt.cus,
pvt.[1] as jan, pvt.[2] as feb, pvt.[3] as mar, pvt.[4] as apr,
pvt.[5] as may, pvt.[6] as jun, pvt.[7] as jul, pvt.[8] as aug,
pvt.[9] as sep, pvt.[10] as oct, pvt.[11] as nov, pvt.[12] as [dec], pvt.FY
FROM (
SELECT yr, mon, sm, sg, sp, cus, nps, SUM(nps) OVER(PARTITION BY yr) as FY
FROM #temp
) as dat
PIVOT (
SUM(NPS)
FOR Mon IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) as pvt
-- FG
SELECT pvt.YR, pvt.sm, pvt.sg, pvt.sp, pvt.cus,
pvt.[1] as jan, pvt.[2] as feb, pvt.[3] as mar, pvt.[4] as apr,
pvt.[5] as may, pvt.[6] as jun, pvt.[7] as jul, pvt.[8] as aug,
pvt.[9] as sep, pvt.[10] as oct, pvt.[11] as nov, pvt.[12] as [dec], pvt.FG
FROM (
SELECT yr, mon, sm, sg, sp, cus, gwt, SUM(gwt) OVER(PARTITION BY yr) as FG
FROM #temp
) as dat
PIVOT (
AVG(GWT)
FOR Mon IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) as pvt
-- Clean up
DROP TABLE #temp
请注意,此解决方案是为SQL Server设计的,因为它不清楚您使用的是哪些DBMS。您尝试了哪些查询?您使用的是哪些DBMS?博士后?甲骨文?谢谢。但我想显示1为一月,2为二月。。。有可能吗。请建议。是的,只需重命名列即可。我会把它添加到示例中,再次感谢。但当前查询不显示FY和FG别名列。FY=1月至12月的NPS总和,FG=平均值(1月至12月)。请提出建议。我解释了您的查询,您希望FY为每个月的值。请更准确地描述你的问题。您希望在月份列中看到什么?我添加了我认为您可能需要的代码。但请验证它,并为您的问题添加更好的描述。:-)