爲什麼不這樣做,以至於你不必使用聯合,你只需要橫向掃描數據:
SELECT [Year] = @LtYear,
[Sum of Total Salary] = s.s,
[Average Salary] = s.a,
[Employee Name] = e.first_name + ' ' + e.last_name,
[Work Experience] = CONVERT(VARCHAR(12), e.work_Exp
FROM employee_data.dbo.employee AS e
CROSS JOIN
(
SELECT SUM(Total_Salary), AVG(Total_Salary)
FROM employee_data.dbo.employee
WHERE [Year] = @LtYear
) AS s(s,a)
WHERE e.[Year] = @LtYear
AND e.First_Name = @first_name
AND e.Last_Name = @last_name;
不知道,如果你真的打算硬編碼'first'
和'last'
,但我懷疑那些會作爲參數更好,特別是如果你要多次引用它們。
鑑於您的要求用Excel驅動,也許嘗試:
DECLARE @y CHAR(4);
SET @y = CONVERT(CHAR(4), @LtYear);
SELECT col1 = 'Sum of total salary for ' + @y,
col2 = CONVERT(NVARCHAR(255), sum(Total_Salary) as Salary)
From employee_data.dbo.employee
where [year] = @LtYear
UNION ALL
SELECT 'Overall Average Salary ' + @y,
CONVERT(NVARCHAR(255), avg(Total_Salary))
From employee_data.dbo.employee
where [year] = @LtYear
UNION ALL
SELECT 'Employee Name - 1',
CONVERT(NVARCHAR(255), first_name+' '+last_name)
From employee_data.dbo.employee
where [year] = @LtYear
and First_Name = 'first'
and Last_Name = 'last'
UNION ALL
SELECT 'Individual Employee Experience ' + @y,
CONVERT(NVARCHAR(255), work_Exp)
From employee_data.dbo.employee
where [year] = @LtYear
and First_Name = 'first'
and Last_Name = 'last';
注意到一些變化:
- 下降的所有別名 - 他們在第一個語句後會忽略無論如何。
- 對第二列使用了顯式轉換,以獲得一個有希望兼容的數據類型。
- 將方括號內的所有關鍵字(例如
year
)妥善包含在內。刪除那些不必要的 - 他們只是使查詢更難以閱讀。
- 創建年份參數的字符串版本,以便它可以附加到第一列而不必執行任何轉換。
現在,你已經淡化了這個問題,還有更多的查詢是我們看不到的。但我仍然認爲一個更好的方法是將工會與基表對齊,並以此方式執行此操作(尤其是在對同一個表有10或15個查詢的情況下)。這不一定會有任何不同,但它將是一個很容易維護。
;WITH x AS
(
SELECT
y = CONVERT(CHAR(4), @LtYear),
[ss] = CONVERT(NVARCHAR(255), s.s),
[as] = CONVERT(NVARCHAR(255), s.a),
[en] = CONVERT(NVARCHAR(255), e.first_name + ' ' + e.last_name),
[we] = CONVERT(NVARCHAR(255), e.work_Exp)
FROM employee_data.dbo.employee AS e
CROSS JOIN
(
SELECT SUM(Total_Salary), AVG(Total_Salary)
FROM employee_data.dbo.employee
WHERE [Year] = @LtYear
) AS s(s,a)
WHERE e.[Year] = @LtYear
AND e.First_Name = @first_name
AND e.Last_Name = @last_name
)
SELECT 'Sum of total salary for ' + y, [ss] FROM x
UNION ALL
SELECT 'Overall average salary for ' + y, [as] FROM x
UNION ALL
SELECT 'Employee Name - 1', [en] FROM x
UNION ALL
SELECT 'Individual Employee Experience ' + y, [we] FROM x;
此外,我認爲你的方法首先是非常麻煩的。通過將這些查詢拼湊在一起並手動將結果粘貼到Excel中,您真的可以執行數據驗證嗎?當然,有一個更自動化的方法來做到這一點,而不是試圖定製一個笨拙的SQL查詢以符合您的過程,您應該改進過程...
將所有結果投射到'varchar'應該適合你。 – PinnyM
爲什麼你需要在單獨的行而不是單列的多列?另外[請不要轉換爲'varchar' - 指定長度以及](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar -without-length.aspx)。 –
將結果複製到驗證電子表格 – Tone