【问题标题】:Msg 116, Level 16, State 1消息 116,级别 16,状态 1
【发布时间】:2016-08-12 16:29:50
【问题描述】:

请帮我解决这个问题

消息 116,级别 16,状态 1,过程 openclosebycat,第 18 行
子查询时,选择列表中只能指定一个表达式 没有与 EXISTS 一起引入。

消息 116,级别 16,状态 1,过程 openclosebycat,第 20 行
当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。

我的代码:

select distinct
    (SELECT COUNT(*) 
     FROM dbo.PROBS 
     WHERE (STATUS LIKE 'closed')
       AND (OPEN_TIME >= @DateFrom)
       AND (CLOSE_TIME <= @DateTo)) AS closen,
   (SELECT NUMBER, STATUS, ID 
    FROM dbo.PROBS 
    WHERE (STATUS LIKE 'closed')
      AND (OPEN_TIME >= @DateFrom)
      AND (CLOSE_TIME <= @DateTo)) AS closedet,
  (SELECT NUMBER, STATUS, ID 
   FROM dbo.PROBS 
   WHERE (STATUS LIKE 'open')
     AND (OPEN_TIME >= @DateFrom)
     AND (CLOSE_TIME <= @DateTo)) AS opendet,
  (SELECT COUNT(*)  
   FROM dbo.PROBS
   WHERE (STATUS = 'closed') 
     AND (CATEGORY = 'problem') 
     AND (OPEN_TIME >= @DateFrom)
     AND (CLOSE_TIME <= @DateTo)) AS closeporb,
 (SELECT COUNT(*) 
  FROM dbo.PROBS
  WHERE (STATUS = 'closed') 
    AND (CATEGORY = 'request for information') 
    AND (OPEN_TIME >= @DateFrom)
    AND (CLOSE_TIME <= @DateTo)) AS closereinfo,
 (SELECT COUNT(*)  
  FROM dbo.PROBS 
  WHERE (STATUS = 'closed') 
    AND (CATEGORY = 'incident') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS closeincid,
 (SELECT COUNT(*)  
  FROM dbo.PROBS 
  WHERE (STATUS = 'closed') 
    AND (CATEGORY = 'complaint') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS closecomp,
 (SELECT COUNT(*)  
  FROM dbo.PROBS 
  WHERE (STATUS = 'open') 
    AND (CATEGORY = 'problem') 
    AND (OPEN_TIME >= @DateFrom)
    AND (CLOSE_TIME <= @DateTo)) AS openporb,
 (SELECT COUNT(*)  
  FROM dbo.PROBS 
  WHERE (STATUS = 'open') 
    AND (CATEGORY = 'request for information') 
    AND (OPEN_TIME >= @DateFrom)
    AND (CLOSE_TIME <= @DateTo)) AS openreinfo,
 (SELECT COUNT(*)  
  FROM dbo.PROBS 
  WHERE (STATUS = 'open') 
    AND (CATEGORY = 'incident') 
    AND (OPEN_TIME >= @DateFrom)
    AND (CLOSE_TIME <= @DateTo)) AS openincid,
 (SELECT COUNT(*)  
  FROM dbo.PROBS 
  WHERE (STATUS = 'open') 
    AND (CATEGORY = 'complaint') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS opencomp,
 (SELECT COUNT(*) 
  FROM dbo.PROBS 
  WHERE (STATUS LIKE 'open')
    AND (OPEN_TIME >= @DateFrom)
    AND (CLOSE_TIME <= @DateTo)) AS openn
FROM
    dbo.PROBS

【问题讨论】:

  • 看起来您的程序openclosebycat 没有完全粘贴到问题中,并且问题与EXISTS 关键字相关,该关键字也丢失了。
  • 您肯定需要将所有这些代码替换为相关的 CASE 语句。没有理由在 select 语句中执行所有这些子查询。这里的特殊问题是您的每个子选择只能返回一个结果,有些返回 3(NUMBER、STATUS、ID)。

标签: sql asp.net sql-server sql-server-2008 stored-procedures


【解决方案1】:

SELECT 中的子查询只能选择一个属性。我不确定您要做什么,但是您必须重新编写如下内容:

SELECT   NUMBER
,        STATUS
,        ID
,        SUM(CASE 
                  WHEN STATUS like 'closed' and OPEN_TIME >= @DateFrom and CLOSE_TIME <= @DateTo 
                     THEN 1 
                  ELSE 0 
             END) as closen
,        {same for the other counts}
FROM     dbo.PROBS
GROUP BY NUMBER
,        STATUS
,        ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多