1

我有这张桌子:

id   owner   model  
1    1       circle  
2    1       rectangle  
3    1       squire 
4    1       pyramid
5    2       apple  
6    2       orange   
8    3       circle  
9    3       rectangle  
10   3       star

我需要一个选择才能看到:

owner   model 1    model 2       model 3     model 4
1       circle     rectangle     squire      pyramid
2       apple      orange          
3       circle     rectangle     star

请帮忙。

4

3 回答 3

2

您正在寻找交叉表查询。有关教程,请参阅http://www.mssqltips.com/sqlservertip/1019/crosstab-queries-using-pivot-in-sql-server/

于 2013-10-05T05:56:10.857 回答
1

假设每个组的每个所有者将有 3 行,

如果不是这种情况,那么我必须写一个 SP(现在不能做,以后会帮助你)

select [owner], [group], 
    parsename(Model,3) as Model1
    ,parsename(Model,2) as Model1
    ,parsename(Model,1) as Model1
from
(
select [owner], [group],
STUFF((
    select '.' + model
    from Table1 t2 where 
    t2.[owner]=t1.[owner]
    and t2.[group]=t1.[group]
    for xml path('')),1,1,'') Model
from Table1 t1
group by [owner],[group]
)t

SQL小提琴

更新(根据 OP 要求)

select [owner]
    ,case len(model)-len(replace(model,'.',''))
        when 3 then parsename(replace(model,'.'+reverse(substring(reverse(model),1,charindex('.',model,1))),''),3)
        when 2 then parsename(Model,3)
        when 1 then parsename(Model,2)
        else Model 
    end as Model1
    ,case len(model)-len(replace(model,'.',''))
        when 3 then parsename(replace(model,'.'+reverse(substring(reverse(model),1,charindex('.',model,1))),''),2)
        when 2 then parsename(Model,2)
        when 1 then parsename(Model,1)
        else ''
    end as Model2
    ,case len(model)-len(replace(model,'.',''))
        when 3 then parsename(replace(model,'.'+reverse(substring(reverse(model),1,charindex('.',model,1))),''),1)
        when 2 then parsename(Model,1)
        else ''
    end as Model3
    ,case len(model)-len(replace(model,'.',''))
        when 3 then reverse(substring(reverse(model),1,charindex('.',model,1)))
        else ''
    end as Model4
from
(
select [owner], 
    STUFF((
    select '.' + model
    from Table1 t2 where 
    t2.[owner]=t1.[owner]
    for xml path('')),1,1,'') Model
from Table1 t1
group by [owner]
)t

SQL小提琴

于 2013-10-05T06:18:00.687 回答
0

您作为结果表呈现的根本不是表格。它也不是交叉表,尽管它看起来有点相似。您真正要寻找的是连接字符串的聚合函数,但不幸的是不存在。唯一的解决方案是使用 T-SQL 创建一个用户定义的解决方案。但这不适合胆小的人。

于 2013-10-05T07:00:40.663 回答