【问题标题】:TSQL PIVOT Function: Invalid column name error and creating calculated columnTSQL PIVOT 函数:无效列名错误并创建计算列
【发布时间】:2015-04-16 16:01:53
【问题描述】:

我对 PIVOT 功能还很陌生,过去一天半以来我一直在尝试解决这个问题,所以我想在潜伏了这么久之后创建一个帐户,然后问一下。

我有一张表格,布局如下:

AsOfDt      AcctNum MntYr   Dt          Category                Count
4/15/2015   12345   Jan-15  1/18/2015   Registered User         1
4/15/2015   12346   Feb-15  2/7/2015    New Registration User   1
4/15/2015   12347   Jan-15  1/27/2015   Unique Account          1
4/15/2015   12348   Jan-15  1/24/2015   Registered User         1

这是我想要达到的最终结果

MntYr        Account Population New Registration User   Registered User Unique Account
Jan 2015     330984             12                      26212           26311
Feb 2015     331897             2953                    58702           58894
Mar 2015     343561             950                     29498           29638
Apr 2015     343181             675                     8845            8916
Grand Total  1349623            4590                    123257          123759

这是我目前构建的查询:

WITH BaseQuery AS (
                SELECT 
                    MntYr
                    ,Category
                    ,[Count]
                FROM [dbo].[rpt_gen_WebPortal_TestingData]
              )

SELECT       [MntYr]
        ,'Account Population'
        ,'Unique Account'
        ,'Registered User'
        ,'New Registration User' 

FROM BaseQuery


pivot (sum([count]) for MntYr  
    in ("Jan 2015", "Feb 2015", "Mar 2015", "Apr 2015" )
    ) AS Pivoting

我的第一个问题:

在第二个 SELECT 语句中,我的 MntYr 列出现错误,“列名 'MntYr' 无效。”我真的不明白为什么这会引发错误。当我在 BaseQuery 拉取中明确命名该列时,尝试拉取该列有什么问题?

我的第二个问题:

我还想根据(唯一帐户/帐户人口)的百分比创建一个计算字段,但我不太确定如何在 PIVOT 函数中处理计算字段。关于如何开始使用这个有什么想法吗?

任何和所有的帮助将不胜感激! 谢谢。

【问题讨论】:

  • 对,这些是每个类别每月所有计数的总和。如果我不使用枢轴,您会如何建议?
  • 这是一个枢轴,我只是对枢轴子句中的月/年值感到困惑。账户人数是多少?
  • 这将是表中的另一种类别类型,只是没有显示在我拉出的行中。

标签: tsql pivot calculated-columns


【解决方案1】:

你的枢纽子句是错误的。您也不需要 CTE。试试这个:

SELECT 
    MntYr
    ,[Account Population]
    ,[Unique Account]
    ,[Registered User]
    ,[New Registration User]
    ,case 
        when isnull([Account Population],0) = 0 then 0 
        else 100 * [Unique Account] / [Account Population]
    end Pct
FROM (
    SELECT 
        MntYr
        ,Category
        ,[Count]
    FROM [dbo].[rpt_gen_WebPortal_TestingData]
) BaseQuery
pivot (sum([Count]) for Category
    in ([Account Population]
        ,[Unique Account]
        ,[Registered User]
        ,[New Registration User] )
    ) AS Pivoting

【讨论】:

  • 做到了!我真的很感激帮助!那么是不是不用在子句中调用pivot函数中的计算字段呢?我想这也是我有点困惑的部分原因
  • 不,pivot 子句正在创建新列。之后您需要进行计算,这就是您在查询中看到的位置。
  • 关于这个问题的最后一个问题...如果我想要计算出的百分比,我们想出的百分比包括 2 个小数位,你会如何建议这样做?我目前已经到了可以将其转换为浮点数的地步,但我无法限制显示的小数位。
  • 最简单的方法:将 100 替换为 100.0 以获取浮点数并在您的报告或应用程序中格式化值。如果您必须在 sql 中执行此操作,您可以将整个计算放在 ROUND 函数中,并将其放在 CONVERT 中。像这样的东西:CONVERT(numeric(10,2),ROUND(100.0 * [Unique Account] / [Account Population],2))
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 2020-12-12
  • 2013-11-04
  • 1970-01-01
  • 2020-09-07
  • 2018-11-08
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多