用于显示分层数据的 SQL Server 查询或工具
我们有一个通用的组织表结构,可以将其视为树形或金字塔层次结构。我们基本上有多个想要展示的“树”。为一家公司,为另一家公司等。
有谁知道显示这些数据的好方法? SQL 查询会很好,怀疑它是否可能,但我不会反对使用一些 OTS 工具(最好是免费的)。我还想避免某种类型的报告。我不需要实际的解决方案,只需知道是否可能。因此,如果你说 SQL,如果你能给我一个显示根离开的 2 表示例,我会很高兴。
结构非常一般
每个表都通过代理链接key CompanyID、CompanyGroupID 等。
对于我们显示/查询这些数据的方式有什么建议吗?最后的手段是编写一个快速的 C# Windows 应用程序...
我们希望以树的形式看到它:
-- 1-Company
-- / \
-- CompanyGroupA CompanyGroupB
-- / \ \
-- CompanyStoreA1 CompanyStoreA1 CompanyStoreB
-- / \ / \
--Employee A B C
为了取悦大众,这里有一个用于填充查询的示例测试脚本。
DECLARE @Company table (id int, name varchar(40) )
INSERT @Company VALUES (1,'Living Things' )
INSERT @Company VALUES (2,'Boring Company' )
DECLARE @CompanyGroup table (id int, name varchar(40), CompanyID int)
INSERT @CompanyGroup VALUES (1,'Pets',1 )
INSERT @CompanyGroup VALUES (2,'Humans',1 )
INSERT @CompanyGroup VALUES (3,'Electronics',2 )
INSERT @CompanyGroup VALUES (4,'Food',2 )
DECLARE @CompanyStore table (id int, name varchar(40), CompanyGroupID int)
INSERT @CompanyStore VALUES (1,'PetsStoreA',1 )
INSERT @CompanyStore VALUES (2,'PetsStoreB',1 )
INSERT @CompanyStore VALUES (3,'PetsStoreC',1 )
INSERT @CompanyStore VALUES (4,'PetsStoreD', 1)
INSERT @CompanyStore VALUES (5,'HumansStore',2 )
INSERT @CompanyStore VALUES (6,'FoodStore',3 )
最终的解决方案非常棒,我修改了 usp_DrawTree 以接受 varchar 与 ints,因为我必须使我的查询 id 唯一。然后我只是做了一个选择/联合所有并建立了父子关系。
select * into #TreeData from (
select ID='C' + cast(id as varchar(10)),
ParentID=null,
DataForBox=name + '(' + cast(id as varchar(10)) + ')',
ExtraInfo='',
SortColumn=name
from Company c
)
union all (
select ID='CG' + cast(id as varchar(10)),
ParentID=cg.CompanyID ,
DataForBox=name + '(' + cast(id as varchar(10)) + ')',
ExtraInfo='',
SortColumn=name
from CompanyGroup cg join Company c on c.ID=cg.CompanyID
)
//union all rest of hierarchy
)
We have a general organizational table structure, think of it s a Tree or Pyramid Hierarchy. We basically have multiple "trees" we want to show. On for one company, one for another ETC.
Does anyone know of a good way to display this data? SQL Query would be nice, doubt it would be possible, but I wouldn't be against using some OTS tool (preferably free). I would also like to avoid some type of report. I don't need an actual solution just need to know if its possible. So if you say SQL if you can give me a 2 table example of showing a root a leave I would be happy.
Structure is pretty general
And each table is linked through a surrogate key CompanyID, CompanyGroupID, etc.
Any suggestions on ways we could display/query for this data? Last resort is to write a quick C# Windows Application...
We would like to see it in tree form:
-- 1-Company
-- / \
-- CompanyGroupA CompanyGroupB
-- / \ \
-- CompanyStoreA1 CompanyStoreA1 CompanyStoreB
-- / \ / \
--Employee A B C
In attempt to please the masses here is an example test script to populate the query.
DECLARE @Company table (id int, name varchar(40) )
INSERT @Company VALUES (1,'Living Things' )
INSERT @Company VALUES (2,'Boring Company' )
DECLARE @CompanyGroup table (id int, name varchar(40), CompanyID int)
INSERT @CompanyGroup VALUES (1,'Pets',1 )
INSERT @CompanyGroup VALUES (2,'Humans',1 )
INSERT @CompanyGroup VALUES (3,'Electronics',2 )
INSERT @CompanyGroup VALUES (4,'Food',2 )
DECLARE @CompanyStore table (id int, name varchar(40), CompanyGroupID int)
INSERT @CompanyStore VALUES (1,'PetsStoreA',1 )
INSERT @CompanyStore VALUES (2,'PetsStoreB',1 )
INSERT @CompanyStore VALUES (3,'PetsStoreC',1 )
INSERT @CompanyStore VALUES (4,'PetsStoreD', 1)
INSERT @CompanyStore VALUES (5,'HumansStore',2 )
INSERT @CompanyStore VALUES (6,'FoodStore',3 )
The final solution was pretty awesome I modified the usp_DrawTree to accept varchar vs ints because i had to make my query ids unique. I then just did a select/union all and built the parent child relationship.
select * into #TreeData from (
select ID='C' + cast(id as varchar(10)),
ParentID=null,
DataForBox=name + '(' + cast(id as varchar(10)) + ')',
ExtraInfo='',
SortColumn=name
from Company c
)
union all (
select ID='CG' + cast(id as varchar(10)),
ParentID=cg.CompanyID ,
DataForBox=name + '(' + cast(id as varchar(10)) + ')',
ExtraInfo='',
SortColumn=name
from CompanyGroup cg join Company c on c.ID=cg.CompanyID
)
//union all rest of hierarchy
)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Brad Schulz 以 usp_DrawTree。
Brad Schulz to the rescue in the form of usp_DrawTree.
您不提供任何表结构,因此这里是处理树结构的递归 CTE 的示例:
OUTPUT:
EDIT based on OP's给定的表和数据:
尝试如下所示:
OUTPUT:
编辑在OP编辑后指出
我们希望以树形形式看到它
。该问题被标记为
sql-server-2008
和hierarchical-data
,并且OP想要进行复杂的格式化以显示数据。然而,这种类型的处理和显示不是 TSQL 的领域,而是应用程序语言应在何处处理和格式化 SQL 查询提供的平面数据的一个非常清晰的示例。我提供了这样一个查询,应用程序可以使用它来构建可视化树显示。另请注意,简单的树示例(每个父级不超过两个子级)可能不太现实,并且当单个父级存在许多子级时,显示将变得难以构建并且不美观。you don't provide any table structure, so here is a sample of a recursive CTE processing a tree structure:
OUTPUT:
EDIT based on OP's given tables and data:
try something like this:
OUTPUT:
EDIT after OP's edit stating that
We would like to see it in tree form
.The question is tagged
sql-server-2008
andhierarchical-data
, and the OP wants to do complex formatting for display f the data. However this type of processing and display is not the realm of TSQL and is a very clear example of where the application language should process and format flat data provided by a SQL query. I have provided such a query that could be used by an application to build a visual tree display. Also note that the simple tree example (no more than two children per parent) might not be very realistic and when many children exist for a single parent, the display will become difficult to construct and not pleasing to the eye.您可以使用报告服务来显示它,就像通过 SQL 2008 获得的那样;如果你幸运的话,它可能已经设置好了——如果不是的话,那也很容易做到。您可以使用报告服务中的钻取功能来允许您的用户根据需要轻松钻取和钻出数据。
在查询方面;这棵树是生长还是固定的?从数据库中获取数据的 SQL 查询非常简单。
You could use reporting services to display it back which you get with SQL 2008; if you are lucky it might be setup already -- if not its quite easy to do that. You could use the drill in features in reporting services to get allow your users to drill in and out of the data as needed very easily.
In terms of the query; does the tree grow or is it fixed? The SQL Query to get the data out from the database is quite simple though.
我相信 SQL Server 2008 提供了一种新的数据类型来帮助解决这种情况。这是一个我相信会有帮助的链接 - http://msdn.microsoft。 com/en-us/magazine/cc794278.aspx。我没有在任何评论中看到它,所以希望这会有所帮助。
I believe SQL Server 2008 offers a new data type to help with this scenario. Here is a link that I believe will help - http://msdn.microsoft.com/en-us/magazine/cc794278.aspx. I didn't see it in any comments, so hope this helps.