Sql 执行存储过程时没有列名
我正在处理这个存储过程,它应该根据输入的季度和年度给出值 存储的过程有动态的2列,其中包含金额的总和。但是,它没有显示这两列(S1、P1)的列名,甚至没有给出值Sql 执行存储过程时没有列名,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在处理这个存储过程,它应该根据输入的季度和年度给出值 存储的过程有动态的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,
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
在列列表中使用函数时,不会保留原始列名。您需要使用列别名。例如:
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语句以查看问题所在。在列列表中使用函数时,不会保留原始列名。您需要使用列别名。例如:
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语句以查看问题所在。您需要在子查询之外为它们指定别名
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
您需要在子查询之外为它们指定别名
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
对这两个子查询使用
alias
name以获取结果中的列名。可以这样重写
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
对这两个子查询使用
alias
name以获取结果中的列名。可以这样重写
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
对这两个子查询使用别名以获取结果中的列名。甚至没有给出价值观。您必须弄清楚,通过使用表DATA检查输入参数值,这些值被假定为两个子查询的总和(金额),使用别名来获取结果中的列名。甚至没有给出价值观。您必须通过检查输入参数值和表数据来确定这些值应该是我必须的总和。非常感谢:)没问题!你可以点击复选框来接受答案,这样将来的用户也可以看到解决你问题的答案。是的,我不得不这么做。非常感谢:)没问题!您可以单击复选框接受答案,以便将来的用户也可以看到解决您问题的答案。