Mysql 需要跨选项卡SQL查询的帮助吗
这是源示例表: UserID UserNameType UserName 1 First Name FN1 1 Last Name LN1 2 First Name FN2 2 Last Name LN2 3 First Name FN3 3 Last Name LN3 4 First Name FN4 4 Last Name LN4 UserID UserNameType用户名 1名FN1 1姓LN1 2名字FN2 2姓LN2 3名字FN3 3姓LN3 4名字FN4 4姓LN4 我希望有一个SQL查询来显示我的结果,如下面给定的格式 UserID FirstName LastName 1 FN1 LN1 2 FN2 LN2 3 FN3 LN3 4 FN4 LN4 UserID FirstName LastName 1 FN1 LN1 2 FN2 LN2 3 FN3 LN3 4 FN4 LN4 需要更多的帮助 谢谢,Mysql 需要跨选项卡SQL查询的帮助吗,mysql,sql,sql-server-2005,sql-server-2008,Mysql,Sql,Sql Server 2005,Sql Server 2008,这是源示例表: UserID UserNameType UserName 1 First Name FN1 1 Last Name LN1 2 First Name FN2 2 Last Name LN2 3 First Name FN3 3 Last Name LN3 4 First
Yugal您可以使用子查询
SELECT
UserID,
UserName as FirstName,
(SELECT top 1 UserName
FROM myTable
WHERE UserID = t.UserID
and UserNameType = 'Last Name') as LastName
FROM myTable t
WHERE t.UserNameType = 'First Name'
一个简单的交叉表方法(我个人更喜欢)是使用带有MAX(CASE-WHEN…)模式的groupby操作符来控制交叉表字段。这很容易理解,也很容易扩展到更多领域。我对演出没有把握
select
UserID,
max(case when usernametype='First Name' then username end) as FirstName,
max(case when usernametype='Last Name' then username end) as LastName
from
MyTable T
group by
UserID
为了避免子查询和可能产生的速度损失,只需加入您自己
SELECT DISTINCT
T1.UserID UserID,
T1.UserName FirstName,
T2.UserName LastName
FROM
Users T1 JOIN Users T2
ON T1.UserID = T2.userID
WHERE
T1.UserNameType = 'FirstName'
AND T2.UserNameType = 'LastName'
编辑:现在应该修复。假设您有下表
SELECT
[fn].UserID,
[fn].UserName,
[ln].UserName
FROM
yourTable AS [fn]
INNER JOIN
yourTable AS [ln]
ON [fn].UserID = [ln].UserID
WHERE
[fn].UserNameType = 'FirstName'
AND [ln].UserNameType = 'LastName'
create table #temp1
(
UserID int,
usernametype varchar(10),
username varchar(10)
)
以下是插入内容
insert into #temp1(userid, usernametype, username) valueS(1, 'First Name', 'FN1')
insert into #temp1(userid, usernametype, username) valueS(1, 'Last Name', 'LN1')
insert into #temp1(userid, usernametype, username) valueS(2, 'First Name', 'FN2')
insert into #temp1(userid, usernametype, username) valueS(2, 'Last Name', 'LN2')
insert into #temp1(userid, usernametype, username) valueS(3, 'First Name', 'FN3')
insert into #temp1(userid, usernametype, username) valueS(3, 'Last Name', 'LN3')
insert into #temp1(userid, usernametype, username) valueS(4, 'First Name', 'FN4')
insert into #temp1(userid, usernametype, username) valueS(4, 'Last Name', 'LN4')
SQl查询
SELECT userid, [First Name], [Last Name]
FROM
(
SELECT userid, usernametype, username FROM #temp1
)
p
PIVOT
(
Max(username) FOR usernametype
IN ([First Name], [Last Name])
) AS pvt
最终结果集
就我个人而言,我会重新设计,因为这是一个非常糟糕的设计选择,随着时间的推移会导致一些主要的性能问题。谷歌搜索使用EAV表的问题。嗨,HLGEM,我刚刚给出了一个例子,说明我拥有什么样的数据,以及我期望从中得到什么样的结果集。
请参考实际问题的附图
我已经尝试过DEM建议的解决方案,但它不适合实际问题。谢谢YugalHI All,mellamokb建议的解决方案在这里奏效了……这将给每个用户标识两次,一次将把FirstName和LastName字段放在最前面。这两个字段都会起作用,只有测试才会显示哪一个更适合这种情况+1:对于我要加入的两个字段,作为
n
字段的一般解决方案,这正是我要走的路。(虽然如果有许多属性类型,我会在WHERE子句中将它们筛选为我正在使用的属性类型。)谢谢mellamokb,我终于找到了解决方案。。。谢谢,Yugalu你在你的查询窗口中尝试过这个吗?:)没有你描述的那么可怕:)我认为,它比子查询(每个记录的行为类似于循环)plz更好。同时检查查询成本。与您的相比,表扫描减少了50%。仅供参考,如果缺少非聚集索引。想象一下,如果我实施它会怎么样。原因是你的子问题我总是很惊讶,我忘了PIVOT已经存在这么久了。但现在我想起来了,我有时不得不避免这样做是有原因的。。。如果数据透视字段合法地全部包含空值,则数据透视会将其从结果集中删除。多棒的git:(但这正是这里需要的,所以我投了票:)嗨,Dems,你的查询对提到的用户表有效,但是,我需要更多关于类似类型的表结构的帮助,请看附件。当我在这里给出的表中应用你的查询时,它复制了结果集。Dems,在最初提出的问题下面,我附上了一张实际问题的图片。它与doctype和docname有关。我不知道是否只有我一个人,但我看不到任何图像,或任何图像链接。。。