Sql动态行列查询 [英] Sql dynamic row column query

查看:185
本文介绍了Sql动态行列查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在SQL表中有数据这样..

  RouteId RouteName  
1 ROUTE1
1 ROUTE2
1 ROUTE3



  Id用户名区域城市RouteId  
1 ABC1 XYZ1 PQR1 1
2 ABC2 XYZ2 PQR1 1
3 ABC3 XYZ3 PQR1 2
4 ABC4 XYZ4 PQR2 2
5 ABC5 XYZ5 PQR2 2
6 ABC6 XYZ6 PQR3 2
7 ABC7 XYZ7 PQR4 3



想要输出为..

  Route1 Route2 Route3  
ABC1 ABC3 ABC7
ABC2 ABC4 NULL
NULL ABC5 NULL
NULL ABC6 NULL



想要路由名称作为标题和UserName作为数据..

我的朋友可以在SQL中建议我查询吗?



什么我试过了:



我试过PIVOT ..但它给出了7个记录......

请帮帮我。 。

解决方案

路线表的第一个正确的RouteID如下。

 RouteId RouteName 
1 ROUTE1
2 ROUTE2
3 ROUTE3





然后使用以下查询获取结果。



 SELECT ROUTE1,ROUTE2,ROUTE3 
FROM(

select rd。*,r.RouteName from [RouteData] rd inner join [route] r on rd。[RouteId] = r。[RouteId]
)as s
PIVOT

max(UserName)
FOR RouteName IN(ROUTE1,ROUTE2,ROUTE3)
)AS pvt





上面的动态查询



  DECLARE   @cols   AS   nvarchar (max), @ query   AS   nvarchar的(最大); 

SELECT @cols = STUFF(

SELECT ' ,' + [RouteName ]
FROM [route]
ORDER BY [RouteId]
FOR XML PATH(' '), TYPE
).value(' 。'' NVARCHAR(MAX)'), 1 1 ' ');

PRINT @cols ;

SET @ query = N ' SELECT' + @ cols + N ' 来自

选择rd。*,r.RouteName来自[RouteData] rd inner join [route] r on rd。[RouteId] = r。[RouteId]

)x
pivot

max(UserName)
for RouteName in('
+ @cols + N ''
)p'
;

EXEC sp_executesql @ query ;







输出:



 ROUTE1 ROUTE2 ROUTE3 
ABC1 NULL NULL
ABC2 NULL NULL
NULL ABC3 NULL
NULL ABC4 NULL
NULL ABC5 NULL
NULL ABC6 NULL
NULL NULL ABC7







假设:



1。下表名称[路线]

 RouteId RouteName 
1 ROUTE1
1 ROUTE2
1 ROUTE3





2。下表名称[RouteData]

 Id用户名区域城市RouteId 
1 ABC1 XYZ1 PQR1 1
2 ABC2 XYZ2 PQR1 1
3 ABC3 XYZ3 PQR1 2
4 ABC4 XYZ4 PQR2 2
5 ABC5 XYZ5 PQR2 2
6 ABC6 XYZ6 PQR3 2
7 ABC7 XYZ7 PQR4 3


I have Data in SQL Table Like this..

RouteId     RouteName
1        ROUTE1
1        ROUTE2
1        ROUTE3


Id     UserName    Area    City    RouteId
1        ABC1      XYZ1    PQR1    1
2        ABC2      XYZ2    PQR1    1
3        ABC3      XYZ3    PQR1    2
4        ABC4      XYZ4    PQR2    2
5        ABC5      XYZ5    PQR2    2
6        ABC6      XYZ6    PQR3    2
7        ABC7      XYZ7    PQR4    3


Want output as..

Route1     Route2     Route3
ABC1        ABC3      ABC7
ABC2        ABC4      NULL
NULL        ABC5      NULL
NULL        ABC6      NULL


Want Route Name as Header and UserName as Data..
Can any one of my friend Suggest me a Query for this in SQL??

What I have tried:

I tried PIVOT.. but it gives 7number of Records...
Please help me..

解决方案

First Correct RouteID of Route Table as follows.

RouteId	RouteName
1	ROUTE1
2	ROUTE2
3	ROUTE3



Then use following Query to obtain Result.

SELECT ROUTE1,ROUTE2,ROUTE3
FROM (
    
        select rd.*,r.RouteName from [RouteData] rd inner join [route] r on rd.[RouteId]=r.[RouteId]
) as s
PIVOT
(
    max(UserName)
    FOR RouteName IN (ROUTE1,ROUTE2,ROUTE3)
)AS pvt



Dynamic Query for above

DECLARE @cols AS nvarchar(max), @query AS nvarchar(max);

SELECT @cols = STUFF(
					(
						SELECT ','+[RouteName]
						FROM [route]
						ORDER BY [RouteId]
						FOR XML PATH(''), TYPE
					).value( '.', 'NVARCHAR(MAX)' ), 1, 1, '');

PRINT @cols;

SET @query = N'SELECT '+@cols+N' from 
             (
               select rd.*,r.RouteName from [RouteData] rd inner join [route] r on rd.[RouteId]=r.[RouteId]
  
            ) x
            pivot 
            (
                max(UserName)
                for RouteName in ('+@cols+N')
            ) p ';

EXEC sp_executesql @query;




Output:

ROUTE1	ROUTE2	ROUTE3
ABC1	NULL	NULL
ABC2	NULL	NULL
NULL	ABC3	NULL
NULL	ABC4	NULL
NULL	ABC5	NULL
NULL	ABC6	NULL
NULL	NULL	ABC7




Assumption:

1. Following Table Name [route]

RouteId     RouteName
1        ROUTE1
1        ROUTE2
1        ROUTE3



2. Following Table Name [RouteData]

Id     UserName    Area    City    RouteId
1        ABC1      XYZ1    PQR1    1
2        ABC2      XYZ2    PQR1    1
3        ABC3      XYZ3    PQR1    2
4        ABC4      XYZ4    PQR2    2
5        ABC5      XYZ5    PQR2    2
6        ABC6      XYZ6    PQR3    2
7        ABC7      XYZ7    PQR4    3


这篇关于Sql动态行列查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆