Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的SQL有什么问题?_Sql_Sql Server_Ssms - Fatal编程技术网

我的SQL有什么问题?

我的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

我必须编辑一个存储过程,并添加按部门对结果进行排序的功能。编辑后,我收到一个错误:

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,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。