Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 需要跨选项卡SQL查询的帮助吗_Mysql_Sql_Sql Server 2005_Sql Server 2008 - Fatal编程技术网

Mysql 需要跨选项卡SQL查询的帮助吗

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

这是源示例表:

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 需要更多的帮助

谢谢,
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有关。我不知道是否只有我一个人,但我看不到任何图像,或任何图像链接。。。