如何在SQL Server中取消激活表?
我正试图解压我的数据,但得到了一些奇怪的结果。我怎样才能做到这一点 下面是我的代码和结果截图。() 还要考虑到我还有更多的列要选择 这是我使用的参考资料如何在SQL Server中取消激活表?,sql,sql-server,pivot,unpivot,Sql,Sql Server,Pivot,Unpivot,我正试图解压我的数据,但得到了一些奇怪的结果。我怎样才能做到这一点 下面是我的代码和结果截图。() 还要考虑到我还有更多的列要选择 这是我使用的参考资料 以上例子的例子 您可以在此处使用交叉应用代替unpivot。我发现语法更容易理解,并且可以保留空值。尝试以下方法: select recid, casenumber, servtype, mins from CaseManagementProgressNote a cross apply (VALUES (preEnrollment_type,
以上例子的例子 您可以在此处使用
交叉应用
代替unpivot
。我发现语法更容易理解,并且可以保留空值。尝试以下方法:
select recid, casenumber, servtype, mins
from CaseManagementProgressNote a
cross apply (VALUES (preEnrollment_type, preEnrollment_minutes),
(screening_type, screeningEna_Minutes),
(ifsp_type, ifsp_minutes)) unpvt (servtype, mins)
您似乎觉得您的两个
UNPIVOT
操作有某种联系。它们不是,只是对第一个结果执行第二个UNPIVOT
如果您查看第一次取消PIVOT的结果
:
select *
from
(
select
recid
,caseNumber
,[preEnrollment_type]
,[preEnrollment_minutes]
,[screening_type]
,[screeningEnA_minutes]
,[ifsp_type]
,[ifsp_minutes]
from
CaseManagementProgressNote
) as cp
unpivot
(
servType for servTypes in ([preEnrollment_type],[screening_type],[ifsp_type])
) as up1
你会看到
╔═════════╦═════════════╦════════════════════════╦═══════════════════════╦═══════════════╦═══════════╦════════════════════╗
║ recid ║ caseNumber ║ preEnrollment_minutes ║ screeningEnA_minutes ║ ifsp_minutes ║ servType ║ servTypes ║
╠═════════╬═════════════╬════════════════════════╬═══════════════════════╬═══════════════╬═══════════╬════════════════════╣
║ 143039 ║ 964699 ║ (null) ║ 45 ║ 20 ║ -NA- ║ preEnrollment_type ║
║ 143039 ║ 964699 ║ (null) ║ 45 ║ 20 ║ SC ║ screening_type ║
║ 143039 ║ 964699 ║ (null) ║ 45 ║ 20 ║ TCM FF ║ ifsp_type ║
╚═════════╩═════════════╩════════════════════════╩═══════════════════════╩═══════════════╩═══════════╩════════════════════╝
或者使用@ander2ed的方法,完全删除UNPIVOT
,如果您不介意它没有过滤掉NULL
s
您链接到的文章也讨论了这个问题:
这里唯一的复杂之处是将输出电话与相应的电话类型相匹配——为此,我们需要进行一些字符串查询,以确保Phone1与PhoneType1匹配,Phone2与PhoneType2匹配,等等
它通过执行第二个UNPIVOT
,然后过滤结果来解决这个问题。您可以通过链接servTypes
和minutess
使其工作。在特定的示例数据中,它们的第一个字符足以识别,并且在两列中是相同的,因此可以将where left(servTypes,1)=left(minutess,1)
添加到查询中
这对我来说似乎毫无意义的复杂,我不推荐这样做,但这是文章和你的查询之间的区别,这也是你的查询在文章运行时不起作用的原因。如果你添加了SQL,你很有可能得到一个有用的问题答案。我喜欢这个查询中的语法,但是,它不在SQL Server中运行。它确实在SQL FIDLE tho中运行。SQL Server在关键字“VALUES”附近给了我以下错误
不正确的语法。
很有趣。您使用的是什么版本的SQL?它在我的计算机上的Microsoft SQL Server 2008 r2.SQL Server Studio 2012中对我有效,但实际的数据库在SQL Server 2005中。我怀疑直到SQL Server 2008才支持交叉应用(values())。那太不幸了。很高兴你从@hvd找到了答案:)我添加了case
语句,效果很好!!。。。谢谢你的解释
select *
from
(
select
recid
,caseNumber
,[preEnrollment_type]
,[preEnrollment_minutes]
,[screening_type]
,[screeningEnA_minutes]
,[ifsp_type]
,[ifsp_minutes]
from
CaseManagementProgressNote
) as cp
unpivot
(
servType for servTypes in ([preEnrollment_type],[screening_type],[ifsp_type])
) as up1
╔═════════╦═════════════╦════════════════════════╦═══════════════════════╦═══════════════╦═══════════╦════════════════════╗
║ recid ║ caseNumber ║ preEnrollment_minutes ║ screeningEnA_minutes ║ ifsp_minutes ║ servType ║ servTypes ║
╠═════════╬═════════════╬════════════════════════╬═══════════════════════╬═══════════════╬═══════════╬════════════════════╣
║ 143039 ║ 964699 ║ (null) ║ 45 ║ 20 ║ -NA- ║ preEnrollment_type ║
║ 143039 ║ 964699 ║ (null) ║ 45 ║ 20 ║ SC ║ screening_type ║
║ 143039 ║ 964699 ║ (null) ║ 45 ║ 20 ║ TCM FF ║ ifsp_type ║
╚═════════╩═════════════╩════════════════════════╩═══════════════════════╩═══════════════╩═══════════╩════════════════════╝
CASE servType
WHEN 'preEnrollment_type' THEN preEnrollment_minutes
WHEN 'screening_type' THEN screeningEnA_minutes
WHEN 'ifsp_type' THEN isfp_minutes
END