我继承了一个存储过程,其代码如下所示。我认为这是一个穷人的PIVOT(必须在SQL Server 2000上运行)。
SELECT
[TheDate] = MAX(
substring(
CONVERT(VarChar(100), thedate, 101),
1,
datalength(CONVERT(VarChar(100), thedate, 101)) *
( CASE index WHEN 123 THEN 1 ELSE 0 END ))),
[Scaled] = MAX(
substring(
CONVERT(VarChar(100), Scaled),
1,
datalength(CONVERT(VarChar(100), Scaled)) *
( CASE index WHEN 123 THEN 1 ELSE 0 END ))),
[Value] = MAX(
substring(
CONVERT(VarChar(100), [Value]),
1,
datalength(CONVERT(VarChar(100), [Value])) *
( CASE index WHEN 123 THEN 1 ELSE 0 END ))),
-- Repeat for other values of "index"
GROUP BY other columns
有没有人见过这个结构? <不是“枢轴”的东西,而是
MAX(SUBSTRING(CONVERT(X),1,DATALENGTH(CONVERT(X))*1 or 0))
为什么不使用
MAX(CASE index WHEN 123 THEN [Value] ELSE NULL END)
答案 0 :(得分:1)
有趣的报价
这是一个穷人的PIVOT
我碰巧知道PIVOT操作符是多个CASE语句之上的皇帝新衣服。实际上,这就是查询计划的显示方式。因此,不止一种方式来看待它。
Martin使用LEFT(,length)是转换为特定长度的快捷方式,因为LEFT(和RIGHT)隐式转换第一个参数。 对于CONVERT(varchar,date,101)这是一种特殊格式,有一种情况不会起作用。
DATALENGTH(CONVERT(X))* 1或0)
这可能是尝试根据列中的最大长度来调整结果列的大小,但显然这不是正确的代码(如果这是目的)。
MAX(CASE index WHEN 123 THEN [Value] ELSE NULL)
看起来好多了。 “index”是一个关键字,所以如果你从工作代码中复制你的代码片段,我会感到惊讶。也许它在2000年有效? 一些提示:
原始返回''不为NULL时为非
MAX(CASE [index] WHEN 123 THEN CONVERT(varchar(100),[Value],101)ELSE''END)
(我为了[值]而投入101以与日期格式保持一致。它对数字没有影响)