查询逻辑问题:在单个查询中使用参数和变量

时间:2013-12-05 00:42:07

标签: sql sql-server tsql stored-procedures

我正在尝试将两个不同的select语句组合在一起(每个语句被放入2个变量中),然后使用2个参数来显示我的结果,但我对自己的逻辑没有100%的信心。

我正在使用2张桌子(工资和部门)

我首先使用2个参数创建了该过程:

CREATE PROCEDURE DepartmentPercentage
(
    @Dept VARCHAR(20)
    @DeptPercent int OUTPUT
)

然后我声明并设置我的2个变量,在其中一个中使用内部连接来连接Salaries和Department表:

AS
DECLARE @Sal int
DECLARE @DeptRate int
SET @Sal = (SELECT SUM(AN_RATE) FROM Salaries) --Total Annual Rate for the entire table
SET @DeptRate = (SELECT SUM(S.AN_RATE) -- Calculates the Total Annual Rate for a given Department
    FROM Salaries as S
    INNER JOIN Department as D
    ON D.DEPT_ID = S.DEPT_ID
    WHERE DESCRIPTION = @Dept)

然后我将out参数设置为等于2个声明变量之间的一个除法:

@DeptPercent = (@DeptRate/@Sal)

我的执行声明:

EXEC DepartmentPercentage @Dept = 'Fire Department', @DeptPercent;

对我的逻辑的任何帮助将不胜感激。我不太了解在单个查询中使用多个参数和变量。

1 个答案:

答案 0 :(得分:0)

这可以让您接近所需的结果,而无需所有参数和变量:

SELECT SUM(S.AN_RATE) AS total,   
       SUM(CASE DESCRIPTION WHEN @Dept THEN S.AN_RATE ELSE 0 END) AS dept,
       SUM(CASE DESCRIPTION WHEN @Dept THEN S.AN_RATE ELSE 0 END) / SUM(S.AN_RATE) AS deptPercent
FROM Salaries as S
INNER JOIN Department as D
    ON D.DEPT_ID = S.DEPT_ID

我知道你可能只想要最后一栏,但认为其他2可能会帮助其他人。如果我早上有机会,我会设置一个带有测试数据的SQLfiddle。

SQLFiddle似乎有一些问题,所以这是一个有效的例子:

--Test Data Setup
DECLARE @Salaries AS TABLE (SAL_ID int, DEPT_ID int, AN_RATE decimal(7,2))
DECLARE @Department AS TABLE (DEPT_ID int, DEPT_DESCRIPTION VARCHAR(20))

INSERT INTO @Department VALUES (1,  'Fire Department')
INSERT INTO @Department VALUES (2,  'Earth Department')
INSERT INTO @Department VALUES (3,  'Wind Department')

INSERT INTO @Salaries VALUES (1, 1, 10000.00)
INSERT INTO @Salaries VALUES (2, 1, 15000.00)
INSERT INTO @Salaries VALUES (3, 1, 20000.00)

INSERT INTO @Salaries VALUES (4, 3, 25000.00)

INSERT INTO @Salaries VALUES (5, 2, 22000.00)

INSERT INTO @Salaries VALUES (6, 2, 21000.00)

--Parameter
DECLARE @Dept VARCHAR(20)
SET @Dept = 'Fire Department'

--Query
SELECT SUM(S.AN_RATE) AS total,   
       SUM(CASE DEPT_DESCRIPTION WHEN @Dept THEN S.AN_RATE ELSE 0 END) AS dept,
       SUM(CASE DEPT_DESCRIPTION WHEN @Dept THEN S.AN_RATE ELSE 0 END) / SUM(S.AN_RATE) * 100 AS deptPercent
FROM @Salaries as S
INNER JOIN @Department as D
    ON D.DEPT_ID = S.DEPT_ID