执行存储过程时没有列名

时间:2017-07-28 14:35:33

标签: sql sql-server stored-procedures

我正在研究这个存储过程,它假定根据输入的Quarter和year给出值。

存储过程具有动态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

3 个答案:

答案 0 :(得分: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语句以查看问题所在。

答案 1 :(得分: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

答案 2 :(得分: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