2017-07-28 35 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