繁体   English   中英

显示结果单行数据,无论是否。 Sql server中的列

[英]Display result Data in single Row ,No matter For no. of column in Sql server

我有这种类型的查询,

select StateName ,countryName
from country_master left join state_master on country_master.countryID = state_master.countryID

产生以下结果,

古吉拉特邦印度
德里印度
HR印度
MP印度
纽约美国
洛杉矶美国
芝加哥美国
WDC USA
伦敦英国

我希望这个结果在单行中与它的关系如,

印度 - 古吉拉特邦德里HR MP
美国 - 纽约洛杉矶芝加哥英国 - 伦敦

有任何构建此查询的想法
建议我,谢谢,

这个问题本质上是将多行连接成单个文本字符串的重复

这是一个在Sql Server 2008中工作的方法:

WITH Ranked ( countryID, rnk, stateName )  
         AS ( SELECT countryID,
                     ROW_NUMBER() OVER( PARTITION BY countryID ORDER BY countryID ),
                     CAST( stateName AS VARCHAR(8000) ) 
                FROM state_master),
AnchorRanked ( countryID, rnk, stateName )  
         AS ( SELECT countryID, rnk, stateName 
                FROM Ranked
               WHERE rnk = 1 ),
RecurRanked ( countryID, rnk, stateName ) 
         AS ( SELECT countryID, rnk, stateName 
                FROM AnchorRanked
               UNION ALL 
              SELECT Ranked.countryID, Ranked.rnk,
                     RecurRanked.stateName + ', ' + Ranked.stateName
                FROM Ranked
               INNER JOIN RecurRanked 
                  ON Ranked.countryID = RecurRanked.countryID 
                 AND Ranked.rnk = RecurRanked.rnk + 1 )
SELECT countryName, MAX( stateName ) 
  FROM RecurRanked
  INNER JOIN country_master on RecurRanked.countryID = country_master.countryID
 GROUP BY countryName;

你可以在这里看到几种方法来实现这种技术: https//www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

如果你的连续城市列表长度超过8000个字符,你需要小心,尽管如果这是一个问题,你可能能够做出像varchar(max)这样的事情(除了它可能的事实)不是一个非常好的方式来查看数据)。

您可以使用递归合并函数轻松完成此操作。

您创建一个连接递归查询结果的函数,然后在查询中调用该函数。

我对这个问题的回答中的完整代码和示例: 如何将多个列“内嵌”(去标准化/连接)到一个列中?

Select t.countryName , isnull(Stuff((SELECT ', ' + StateName
          FROM state_master where countryID = t.countryID
          ORDER BY StateName
          For XML PATH ('')),1,1,''),'') as c
from country_master  t 
select c.countryName,
       stuff((select ' '+s.StateName
              from state_master as s
              where s.countryID = c.countryID
              for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '')
from country_master as c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM