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 的事情?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio SQL Server 2016 数据库项目和临时表

SQL Server 2016 SA账号登陆不上的办法

有没有办法在 SQL Server CE 中一次搜索所有表的字段?

有没有办法将 SQL Server 2008 mdf 文件转换为 SQL Server Express 版本?

SQL Server - 备份服务器通过

windows server2016 + sql server2016 部署过程,未完成