【问题标题】:T-SQL pivot where clauseT-SQL 中枢 where 子句
【发布时间】:2016-02-10 15:25:01
【问题描述】:

在 SQL Server 中,我想要 PIVOT 一个表并添加一个 WHERE 子句,但我无法弄清楚语法。

数据

dbo.SOME_VIEW
YEAR  AMOUNT
====================
2014  1
2013  2
2012  5.6
2011  574
2010  123

查询

SELECT
    *
FROM SOME_VIEW
PIVOT (SUM(AMOUNT) FOR [YEAR] IN ([2012], [2013], [2014])) AS PIVOTED

现在我想从视图中只获取我将 PIVOT 的年份的行,所以我想添加

WHERE YEAR IN (2012, 2013, 2014)

我尝试过的

WHERE放在FROM SOME_VIEW之后

SELECT
    *
FROM SOME_VIEW WHERE YEAR IN (2012, 2013, 2014)
PIVOT (SUM(AMOUNT) FOR [YEAR] IN ([2012], [2013], [2014])) AS PIVOTED

我得到:Incorrect syntax near the keyword 'PIVOT'。当我在末尾添加WHERE 时,我得到Invalid column name 'YEAR'

问题

当我使用 PIVOT 时,我可以在哪里添加 WHERE 子句?

为什么

为了表现。从 1990 年开始,我认为我有几年,但我只想要最后三年。我希望当我添加一个可以提高性能的地方时。

【问题讨论】:

  • 我不明白这个问题。 IN 子句中未提及的任何具有pivot_column 值的行都会被PIVOT 操作本身自动排除。
  • Demo 按照目前的要求,根本不需要WHERE
  • 我问是因为我认为明确的 WHERE 子句会提高性能。那么 PIVOT 是隐含的 WHERE 吗?
  • 不是这样的。其他行的数据无处可去go。而在 SQL 中,您告诉系统您想要什么,而不是如何去做。不要尝试添加“为了性能”的东西。
  • @Damien_The_Unbeliever 将此作为答案 - 我会接受。

标签: sql sql-server tsql pivot


【解决方案1】:

据我了解,您希望限制传递给 PIVOT 的年份。

您可以使用公用表表达式来做到这一点。

这应该适合你:

;WITH CTE AS (SELECT
 *
FROM #SOME_VIEW 
WHERE [YEAR] IN (2012, 2013, 2014))

SELECT
 *
FROM CTE
PIVOT (SUM(AMOUNT) FOR [YEAR] IN ([2012], [2013], [2014])) AS PIVOTED 

结果:

【讨论】:

    【解决方案2】:

    我确切地知道你的问题在哪里,因为我现在正面临着它。 WHERE 子句和 PIVOT 子句互不相同。因此,PIVOT 不能直接出现在 WHERE 之后,除非它们之间存在障碍。 也就是说,您必须将您的 SELECT 子句包装为另一个 SELECT 子句的子查询,如下:

    选择 * 从

    (

    选择 * FROM SOME_VIEW 年份(2012、2013、2014)

    )

    在([2012]、[2013]、[2014]))中的 [YEAR] 的 SUM(AMOUNT))作为枢轴

    有评论

    SELECT * FROM --您应该添加的主查询

    (

    SELECT * -- 这是你之前的查询

    来自 SOME_VIEW

    年份(2012、2013、2014)

    ) -- 主查询结束。这是 WHERE 和 PIVOT 之间的障碍。在这个括号之后,您现在可以安全地称您为 PIVOT 子句。

    在([2012]、[2013]、[2014]))中的 [YEAR] 的 SUM(AMOUNT))作为枢轴

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多