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为每个月的值。请更准确地描述你的问题。您希望在月份列中看到什么?我添加了我认为您可能需要的代码。但请验证它,并为您的问题添加更好的描述。:-)