2013-01-16 41 views
0

我創建了一個非常簡單的數據驗證存儲過程。我有幾個希望運行的sql語句,只是顯示結果以與源進行比較。我將sql語句與union組合在一起,但不能將不同數據類型的列組合在一起。希望有人會有一個更好的方法來進行建議?存儲過程和工會

USE [employee_data] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[data_employee] 

AS 
BEGIN 

declare @LtYear as varchar(10) 
set @LtYear = '2012' 

SELECT 'Sum of total salary for ' + @LtYear as title, sum([Total_Salary]) as Salary 
From [employee_data].[dbo].[employee] 
where year = @LtYear 

UNION 
select 'Overall Average Salary ' + @LatestYear as title, avg([Total_Salary]) as  'Average Salary' 
From [employee_data].[dbo].[employee] 
where year = @LtYear 

SELECT 'Employee Name - 1' as title, first_name+' '+last_name 
From [employee_data].[dbo].[employee] 
where year = 2012 [email protected] 
and [First_Name] = 'first' 
and [Last_Name] = 'last' 

UNION 
SELECT 'Individual Employee Experience ' + @LtYear as title, cast([work_Exp]as varchar) as 'Work Experience' 
From [employee_data].[dbo].[employee] 
where year = @LtYear 
and [First_Name] = 'first' 
and [Last_Name] = 'last' 

我想看到的結果如下:

合計薪酬:5000
總體平均工資:37000
員工姓名 - 1:第一個最後
員工個人經驗2012: 12

+1

將所有結果投射到'varchar'應該適合你。 – PinnyM

+0

爲什麼你需要在單獨的行而不是單列的多列?另外[請不要轉換爲'varchar' - 指定長度以及](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar -without-length.aspx)。 –

+0

將結果複製到驗證電子表格 – Tone

回答

1

爲什麼不這樣做,以至於你不必使用聯合,你只需要橫向掃描數據:

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查詢以符合您的過程,您應該改進過程...

+0

我傾向於使用單獨的查詢和聯合,以便將結果複製到Excel中的驗證文檔中。還有幾個選擇語句。 – Tone

+0

感謝您的幫助和支持Aaron。 – Tone