有一个表格存储了项目相关的信息。每个项目都有一个ID列(FPNNumber)和一个父项目ID列。如果该项目有父项目,用户需要在该行中选择父项目的ID号填入父项目单元格中。如果没有父项目,则父项目列将填写0。我看到这里有一些类似于我的问题,但是它们似乎都使用了一个级别列,而我没有也不想在我的查询中使用。
从数据库获取数据的存储过程如下:
当我执行这个命令时,结果看起来像这样:
我需要它看起来像这样:
从数据库获取数据的存储过程如下:
SELECT h.[Priority]
,h.[FPNNumber]
,h.[ProjectName]
,sp.SponsorName
,pm.ProjectManagerName
,o.[OrgName]
,HealthID
,[StrategicAlignmentID] + [FinancialAlignmentID] + [TechnologyAlignmentID] As ProjectScore
,h.[Cost]
,h.[Budget]
,h.[PercentComplete]
,Convert(varchar(10),h.[EstimatedImpDt], 101) As EstimatedImpDt
,[EstimatedROI]
,h.[ExpectedBenefit]
,CONVERT(Decimal(10, 2),((DATEDIFF(day, h.[PaybackPerioddt], GETDATE()))/365.0)) As PaybackPerioddt
FROM [ProjectNew].[Header] h
join ProjectNew.Sponsor sp ON h.SponsorID = sp.SponsorID
join ProjectNew.ProjectManager pm ON h.ProjectManagerID = pm.ProjectManagerID
Join ProjectNew.Organization o ON h.OrgID = o.OrgID
where StatusID is null or StatusID < 12
我尝试过一种方法,部分地起作用,但并不完全符合我的需求:
;WITH Parents
AS(
SELECT h.[Priority]
,h.[FPNNumber]
,h.[ProjectName]
,sp.SponsorName
,pm.ProjectManagerName
,o.[OrgName]
,HealthID
,[StrategicAlignmentID] + [FinancialAlignmentID] + [TechnologyAlignmentID] As ProjectScore
,h.[Cost]
,h.[Budget]
,h.[PercentComplete]
,Convert(varchar(10),h.[EstimatedImpDt], 101) As EstimatedImpDt
,[EstimatedROI]
,h.[ExpectedBenefit]
,CONVERT(Decimal(10, 2),((DATEDIFF(day, h.[PaybackPerioddt], GETDATE()))/365.0)) As PaybackPerioddt
FROM [FPN].[ProjectNew].[Header] h
join ProjectNew.Sponsor sp ON h.SponsorID = sp.SponsorID
join ProjectNew.ProjectManager pm ON h.ProjectManagerID = pm.ProjectManagerID
Join ProjectNew.Organization o ON h.OrgID = o.OrgID
WHERE StatusID is null or StatusID < 12 and h.ParentID = 0
Union All
SELECT he.[Priority]
,he.[FPNNumber]
,he.[ProjectName]
,sp.SponsorName
,pm.ProjectManagerName
,o.[OrgName]
,he.HealthID
,[StrategicAlignmentID] + [FinancialAlignmentID] + [TechnologyAlignmentID] As ProjectScore
,he.[Cost]
,he.[Budget]
,he.[PercentComplete]
,Convert(varchar(10),he.[EstimatedImpDt], 101) As EstimatedImpDt
,he.[EstimatedROI]
,he.[ExpectedBenefit]
,CONVERT(Decimal(10, 2),((DATEDIFF(day, he.[PaybackPerioddt], GETDATE()))/365.0)) As PaybackPerioddt
FROM [FPN].[ProjectNew].[Header] he
join ProjectNew.Sponsor sp ON he.SponsorID = sp.SponsorID
join ProjectNew.ProjectManager pm ON he.ProjectManagerID = pm.ProjectManagerID
Join ProjectNew.Organization o ON he.OrgID = o.OrgID
Join Parents cte on cte.FPNNumber = he.ParentID
WHERE StatusID is null or StatusID < 12
)
Select * from Parents
当我执行这个命令时,结果看起来像这样:
ID | ParentID
----------------
1 | 0
2 | 0
4 | 2
5 | 2
3 | 1
6 | 1
7 | 1
我需要它看起来像这样:
ID | ParentID
----------------
1 | 0
3 | 1
6 | 1
7 | 1
2 | 0
4 | 2
5 | 2
因此,具有ID 2的行下有两个相应的子项目,但ID 1的子项目在其下方。
我做错了什么?有没有办法使所有子项目显示在它们的父项目下面?如果是这样,是否有一种方法可以在调用Visual Studio中的ListView中的数据时,使用户单击排序按钮时不会打乱子项目的顺序?