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 CE 中一次搜索所有表的字段?