2017-07-28 49 views
0

我正在处理此存储的proc,它根据输入季度和年份给出值。没有执行存储过程的列名称

存储过程具有动态2列,其具有金额之和。但是代替列名称,它显示的是那些2列(S1,P1)没有列名,甚至没有给出值。

create proc [dbo].[Summary] 
@Quarter int, 
@Year int 
AS 
BEGIN 

Declare @SC AS decimal(18,0) 
Declare @PO AS decimal(18,0) 
Declare @INV AS decimal(18,0) 

SELECT BD.id, 
     BD.project, 
     status, 
     (SELECT Sum(amount) AS S1 
     FROM details a 
     WHERE status = 'S1' 
       AND BD.project = a.project), 
     (SELECT Sum(amount) AS P1 
     FROM details b 
     WHERE status = 'P1' 
       AND BD.project = b.project) 
FROM projectdetails (nolock) BD 
     INNER JOIN details (nolock) D 
       ON BD.project = D.project 
WHERE BD.quarter = @Quarter 
     AND BD.year = @Year 
     AND BD.project = D.project 
GROUP BY BD.lineid, 
      BD.project, 
      status 
END 
+0

对这两个子查询使用别名来获得结果中的列名。 *甚至没有给出值*你必须通过检查输入参数值与表格数据 –

+0

这些值被假设为总和(金额) – beginner

回答

1

当您在列列表中使用函数时,原始列名不会保留。您需要使用列别名。例如:

SELECT BD.ID, 
     BD.Project, 
     Status, 
     (SELECT Sum(amount) AS S1 
     FROM details a 
     WHERE status = 'S1' 
       AND BD.project = a.project) AS SumS1, --Added alias here 
     (SELECT Sum(amount) AS P1 
     FROM details b 
     WHERE status = 'P1' 
       AND BD.project = b.project) AS SumP1 --And here 
FROM ... 

至于你为什么没有获取数据,那是因为你的查询没有返回任何数据。尝试单独运行这些select语句以查看问题出在哪里。

+0

是的,我不得不别名。非常感谢:) – beginner

+0

没问题!您可以点击复选框接受答案,以便将来的用户可以看到解决问题的答案。 –

1

你需要给他们别名的子查询外

create proc [dbo].[Summary] 
@Quarter int, 
@Year int 
AS 
BEGIN 

Declare @SC AS decimal(18,0) 
Declare @PO AS decimal(18,0) 
Declare @INV AS decimal(18,0) 

SELECT BD.ID, 
BD.Project, 
Status, 
(Select SUM(Amount) from Details a where Status='S1' and BD.Project = a.Project) as S1, 
(Select SUM(Amount) from Details b where Status='P1' and BD.Project = b.Project) as P1 
FROM ProjectDetails (NOLOCK) BD 
inner join Details (NOLOCK) D on BD.Project = D.Project 

WHERE BD.Quarter = @Quarter and BD.Year = @Year and BD.Project = D.Project 
Group By BD.LineID, BD.Project,Status 
END 
1

使用alias名字那两个子查询的结果让列名。它可以像这样重写

SELECT BD.id, 
     BD.project, 
     status, 
     Sum(case when status = 'S1' then amount else 0 end) AS S1, 
     Sum(case when status = 'P1' then amount else 0 end) AS P1 
FROM projectdetails BD 
     INNER JOIN details D 
       ON BD.project = D.project 
WHERE BD.quarter = @Quarter 
     AND BD.year = @Year 
     AND BD.project = D.project 
GROUP BY BD.lineid, 
      BD.project, 
      status