我的SQL有什么问题?
我必须编辑一个存储过程,并添加按部门对结果进行排序的功能。编辑后,我收到一个错误: Msg 8120,16级,状态1,程序 会计科目本年度损益,按部门,第543行列 “tmp_rsl.department”在选择列表中无效,因为它不是 包含在聚合函数或GROUP BY子句中 我相信错误不在第543行,也可能只是我的眼睛。 以下是从第485行到第557行的代码:我的SQL有什么问题?,sql,sql-server,ssms,Sql,Sql Server,Ssms,我必须编辑一个存储过程,并添加按部门对结果进行排序的功能。编辑后,我收到一个错误: Msg 8120,16级,状态1,程序 会计科目本年度损益,按部门,第543行列 “tmp_rsl.department”在选择列表中无效,因为它不是 包含在聚合函数或GROUP BY子句中 我相信错误不在第543行,也可能只是我的眼睛。 以下是从第485行到第557行的代码: -- Blank line INSERT INTO #tmp_rsl(acc_id,parent_code,acc_code,des
-- Blank line
INSERT INTO #tmp_rsl(acc_id,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT 0,'','' as acc_code,'' as acc_name,1,0,0,0,0,'BLANK_LINE' as rsl_type,0 as show_line
--OI Other Income
SET @rsl_acc_type='OI'
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT acc_id,department,department_name,parent_code,acc_code,acc_name,acclevel,
ISNULL(yr_credit,0)-ISNULL(yr_debit,0),
ISNULL(ly_credit,0)-ISNULL(ly_debit,0),
ISNULL(mn_credit,0)-ISNULL(mn_debit,0),ISNULL(lm_credit,0)-ISNULL(lm_debit,0),
(CASE WHEN attribute=99 THEN 'CAT_HEAD' WHEN attribute=0 THEN 'FOLDER' ELSE 'DETAIL' END) as rsl_type,0
FROM #tmp_acc_list WHERE acctype=@rsl_acc_type AND acclevel=1
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT acc_id,department,department_name,parent_code,acc_code,acc_name,acclevel,
ISNULL(yr_credit,0)-ISNULL(yr_debit,0),
ISNULL(ly_credit,0)-ISNULL(ly_debit,0),
ISNULL(mn_credit,0)-ISNULL(mn_debit,0),ISNULL(lm_credit,0)-ISNULL(lm_debit,0),
(CASE WHEN attribute=99 THEN 'CAT_HEAD' WHEN attribute=0 THEN 'FOLDER' ELSE 'DETAIL' END) as rsl_type,0
FROM #tmp_acc_list WHERE acctype=@rsl_acc_type AND acclevel<>1 order by department,acc_code
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT 0,department,department_name,'','' as acc_code,'' as acc_name,acclevel,
ISNULL(yr_credit,0)-ISNULL(yr_debit,0),
ISNULL(ly_credit,0)-ISNULL(ly_debit,0),
ISNULL(mn_credit,0)-ISNULL(mn_debit,0),ISNULL(lm_credit,0)-ISNULL(lm_debit,0),
'CAT_SUMM' as rsl_type,1
FROM #tmp_acc_list WHERE acctype=@rsl_acc_type AND acclevel=1
--EX Expenses
SET @rsl_acc_type='EX'
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT acc_id,department,department_name,parent_code,acc_code,acc_name,acclevel,
ISNULL(yr_debit,0)-ISNULL(yr_credit,0),
ISNULL(ly_debit,0)-ISNULL(ly_credit,0),
ISNULL(mn_debit,0)-ISNULL(mn_credit,0),ISNULL(lm_debit,0)-ISNULL(lm_credit,0),
(CASE WHEN attribute=99 THEN 'CAT_HEAD' WHEN attribute=0 THEN 'FOLDER' ELSE 'DETAIL' END) as rsl_type,0
FROM #tmp_acc_list WHERE acctype=@rsl_acc_type AND acclevel=1
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT acc_id,department,department_name,parent_code,acc_code,acc_name,acclevel,
ISNULL(yr_debit,0)-ISNULL(yr_credit,0),
ISNULL(ly_debit,0)-ISNULL(ly_credit,0),
ISNULL(mn_debit,0)-ISNULL(mn_credit,0),ISNULL(lm_debit,0)-ISNULL(lm_credit,0),
(CASE WHEN attribute=99 THEN 'CAT_HEAD' WHEN attribute=0 THEN 'FOLDER' ELSE 'DETAIL' END) as rsl_type,0
FROM #tmp_acc_list WHERE acctype=@rsl_acc_type AND acclevel<>1 order by department,acc_code
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT 0,department,department_name,'','' as acc_code,'' as acc_name,acclevel,
ISNULL(yr_debit,0)-ISNULL(yr_credit,0),
ISNULL(ly_debit,0)-ISNULL(ly_credit,0),
ISNULL(mn_debit,0)-ISNULL(mn_credit,0),ISNULL(lm_debit,0)-ISNULL(lm_credit,0),
'CAT_SUMM' as rsl_type,1
FROM #tmp_acc_list WHERE acctype=@rsl_acc_type AND acclevel=1
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT 0,department,department_name,'','NP' as acc_code,'NET PROFIT/(LOSS)' as acc_name,1,
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*yr_balance ELSE yr_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*ly_balance ELSE ly_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*mn_balance ELSE mn_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*lm_balance ELSE lm_balance END)),
'CAT_NETPROFIT' as rsl_type,1
FROM #tmp_rsl WHERE rsl_type='CAT_HEAD'
那么,是否有人可以指出可能的错误,如果它存在于我所展示的代码部分中
我正在使用Microsoft的SQL Server Management Studio 2014。您在查询中正在执行类似的操作
select EmpId, count(LocationId)
from Employee
或者与之相反的东西
select EmpId, LocationId
from Employee
Group by EmpId
在这两种情况下,都会出现以下错误
列“Employee.EmpId”在选择列表中无效,因为它是
不包含在聚合函数或GROUP BY子句中
如果仔细查看您的查询,您会使用一些聚合函数,如上次查询中的SUM等。错误行号通常会产生误导,尤其是对于存储过程。如果有数百行,它可以很好地指示esp中的错误是查询的哪一部分,但是您应该关注错误的描述 列“tmp_rsl.department”在选择列表中无效,因为它 未包含在聚合函数或GROUP BY中 条款 select列表包含聚合函数或group by子句中不包含的字段部门。 只有一个查询具有聚合函数,并且没有GROUPBY子句
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,
yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT 0,department,department_name,'','NP' as acc_code,'NET PROFIT/(LOSS)' as acc_name,1,
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*yr_balance ELSE yr_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*ly_balance ELSE ly_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*mn_balance ELSE mn_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*lm_balance ELSE lm_balance END)),
'CAT_NETPROFIT' as rsl_type,1
FROM #tmp_rsl WHERE rsl_type='CAT_HEAD'
此查询的总和部分是聚合函数。
你需要在FROM之后添加一组广告。
可能需要几个部门,部门名称,
acc_代码包含在聚合函数中您的上次查询
SELECT
0,
department,
department_name,
'',
'NP' as acc_code,
'NET PROFIT/(LOSS)' as acc_name,1,
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*yr_balance ELSE yr_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*ly_balance ELSE ly_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*mn_balance ELSE mn_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*lm_balance ELSE lm_balance END)),
'CAT_NETPROFIT' as rsl_type,
1
FROM
#tmp_rsl WHERE rsl_type='CAT_HEAD'
这就是问题所在。您使用“department”之类的列,但不使用任何聚合,然后使用sum之类的聚合计算列。你不能把那些柱子混在一起。您没有聚合,所有聚合或没有聚合的列必须是分组的一部分,如下所示:
SELECT
0,
department,
department_name,
'',
'NP' as acc_code,
'NET PROFIT/(LOSS)' as acc_name,1,
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*yr_balance ELSE yr_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*ly_balance ELSE ly_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*mn_balance ELSE mn_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*lm_balance ELSE lm_balance END)),
'CAT_NETPROFIT' as rsl_type,
1
FROM
#tmp_rsl WHERE rsl_type='CAT_HEAD'
GROUP BY department, department_name
问题是在最终insert语句中使用聚合函数SUM。你可能会发现这篇文章很有用 同时
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT 0,department,department_name,'','NP' as acc_code,'NET PROFIT/(LOSS)' as acc_name,1,
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*yr_balance ELSE yr_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*ly_balance ELSE ly_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*mn_balance ELSE mn_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*lm_balance ELSE lm_balance END)),
'CAT_NETPROFIT' as rsl_type,1
FROM #tmp_rsl WHERE rsl_type='CAT_HEAD'
应该是
INSERT INTO #tmp_rsl(acc_id,department,department_name,parent_code,acc_code,description,acclevel,yr_balance,ly_balance,mn_balance,lm_balance,rsl_type,show_line)
SELECT 0,department,department_name,'','NP' as acc_code,'NET PROFIT/(LOSS)' as acc_name,1,
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*yr_balance ELSE yr_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*ly_balance ELSE ly_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*mn_balance ELSE mn_balance END)),
SUM((CASE WHEN acc_code='CS' OR acc_code='EX' THEN -1*lm_balance ELSE lm_balance END)),
'CAT_NETPROFIT' as rsl_type,1
FROM #tmp_rsl WHERE rsl_type='CAT_HEAD'
GROUP BY department,department_name
我只在INSERT SELECT语句中添加了“department”和“department_name”。上一个查询具有聚合列,但没有Group By。