我正在研究这个存储过程,它假定根据输入的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
答案 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