SQL Server 2016 - 有没有办法通过使用 CASE 来做类似于 PIVOT 的事情?

Posted

技术标签:

【中文标题】SQL Server 2016 - 有没有办法通过使用 CASE 来做类似于 PIVOT 的事情?【英文标题】:SQL Server 2016 - Is there a way to do something similar to PIVOT by using CASE instead? 【发布时间】:2021-10-29 18:47:37 【问题描述】:

我有一个名为“typetxt”的列,其中包含“Late Reason”和“Notes”(以及我没有的其他值)不在乎)。我当前的查询有一个 case 语句,只选择“Late Reason”和“Notes”,并将其他所有内容设置为 NULL

我还有一个名为“detail_value”的列,其中包含“Late Reason”或“Notes”的文本值。 'typetxt/detail_value' 的所有值都是 varchar(50)

这就是它的样子:

typetxt detail_value
Late Reason This is a late reason
Notes This is a note

这是我目前正在处理的查询的一部分。我在这之前做了几个连接,在这部分查询之后又做了 3 个连接:

SELECT [id], [rowid], [start_date], [data_type], [detail_value], 
       [typetxt]  = CASE
             WHEN typetxt = 'Late Reason' 
                  or typetxt= 'Notes' THEN typetxt
             ELSE NULL
            END,
       FROM mytable MT
       WHERE [start_date] IS NOT NULL AND [data_type] = 'SAS' 

有什么方法可以在不使用 PIVOT 的情况下添加临时列或类似内容,从而使结果表看起来像这样?

Late Reason Notes
This is a Late Reason NULL
NULL This is a note

如果我必须使用 PIVOT(或动态枢轴),您可以将其添加到上述代码中吗?我试过了

...
       FROM mytable MT
       WHERE [start_date] IS NOT NULL AND [data_type] = 'SAS' 
       PIVOT (
       *not sure what to put here* FOR 'Late Reason' IN (typetxt, detail_value)      
       ) as Late_Reason

搜索更多并阅读this

并尝试添加

 MAX(CASE WHEN [typetxt] = 'Late Reason' THEN [detail_value] END) as [Late_Reason],
 MAX(CASE WHEN [typetxt] = 'Notes' THEN [detail_value] END) as [Notes]

在上述代码中代替 PIVOT,但得到“在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中”错误消息。

尝试在我的这部分查询中添加 GROUP BY,但没有成功。

我对 PIVOT 不熟悉,并且已经对其进行了广泛的查找(也许这证明不是很深啊),但我就是无法理解这部分。感谢您的任何建议/帮助。

【问题讨论】:

“在选择列表中无效” 什么无效?这两个表达式在聚合函数中。 说我的“typetxt”在选择列表中无效。不太确定这意味着什么,我正在研究它所指的内容。可能我只是错过了该错误消息的重点。 想必你也有它没有聚合。语句的 sn-p 并不能告诉我们问题所在。 【参考方案1】:

我想通了。正在使用

 MAX(CASE WHEN [typetxt] = 'Late Reason' THEN [detail_value] END) as [Late_Reason],
 MAX(CASE WHEN [typetxt] = 'Notes' THEN [detail_value] END) as [Notes]

在错误的地方。

这应该在我的查询顶部出现:

SELECT [var1], [var2], [var3], etc 而不是在我上面显示的实际查询中,如果这有意义的话。

【讨论】:

以上是关于SQL Server 2016 - 有没有办法通过使用 CASE 来做类似于 PIVOT 的事情?的主要内容,如果未能解决你的问题,请参考以下文章