Только одно выражение может быть указано в списке выбора, если подзапрос не введен с EXISTS. - SQL Server - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь создать хранимую процедуру, и я написал этот код с использованием SQL Server, но я получаю ошибку

В списке выбора можно указать только одно выражение, если подзапрос не введен с EXISTS

и я не знаю, как ее решить.

CREATE PROCEDURE Calculus
AS
BEGIN
    SELECT
        -- **** Media (Average) **** --
        (SELECT CAST(AVG(CAST(CC AS NUMERIC)) AS VARCHAR(MAX))
         FROM CHALLENGE AS Media),
        -- **** Mediana **** --
        (SELECT CASE WHEN COUNT(CC) % 2 = 0 
                THEN (SELECT TOP 1 ((SELECT TOP 1 CC 
                                     FROM (SELECT TOP 50 PERCENT CC FROM CHALLENGE ORDER  BY CC ASC) AS X
                                     ORDER  BY CC DESC)
                                  + (SELECT TOP 1 CC
                                     FROM (SELECT TOP 50 PERCENT CC FROM CHALLENGE ORDER  BY CC DESC) AS Y
                                     ORDER  BY CC ASC)) / 2)
                ELSE (SELECT TOP 1 CC
                      FROM (SELECT TOP 50 PERCENT CC FROM CHALLENGE ORDER  BY CC) AS X
                      ORDER  BY CC DESC)
                END AS Mediana
         FROM   CHALLENGE),
        -- **** Moda **** --
        (SELECT TOP 1 CC, COUNT(CC) AS Veces
         FROM CHALLENGE
         GROUP BY CC
         ORDER BY COUNT(CC)) AS Moda,
        -- **** Min **** --
        MIN(CC) AS Minimo,
        -- **** Max **** --
        MAX(CC) AS Maximo
    FROM
        CHALLENGE
END

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Эта часть запроса вызывает ошибку.

Это подзапрос, и вы пытаетесь вернуть из него 2 столбца (что приводит к ошибке).

TOP 1 CC и COUNT(CC)

(SELECT TOP 1 CC
       ,COUNT(CC) AS Veces
 FROM CHALLENGE
 GROUP BY CC
 ORDER BY COUNT(CC)) AS Moda

Не уверен, что предложить, потому что наверняка вы единственный, кто знает, что вы намеревались получить отсюда.

0 голосов
/ 13 сентября 2018

Вы должны изменить свой запрос и поместить все подзапросы в (OUTER APPLY) соединение

следующим образом:

   CREATE PROCEDURE Calculus
    AS
    BEGIN
        SELECT
              MediaTableName.MediaFieldName

        FROM
            CHALLENGE
        OUTER APPLY 
            (SELECT CAST(AVG(CAST(CC AS NUMERIC)) AS VARCHAR(MAX)) as MediaFieldName
             FROM CHALLENGE AS t1
             WHERE t1.IDentity = CHALLENGE.IDentity /* this line create join condition and its up to you how use it*/
             ) as MediaTableName

    END

для каждого подзапроса используйте одно внешнее соединение aplly, и вы можете удалитьгде строка предложения

0 голосов
/ 13 сентября 2018

Вы должны начать с рефакторинга вашей хранимой процедуры для ясности.

Пример для справки ниже

CREATE PROCEDURE Calculus
AS
  BEGIN
      DECLARE @Media varchar(max)
      DECLARE @Mediana varchar(max)
      DECLARE @topbottom numeric
      DECLARE @bottomtop numeric
      DECLARE @Moda varchar(max)
      SELECT 
            @Media= Cast(Avg(Cast (CC AS numeric)) AS varchar(max))
      FROM CHALLENGE

      SELECT 
        TOP 50 PERCENT CC 
      INTO #TOP
      FROM   CHALLENGE
      ORDER  BY CC ASC

      SELECT 
        TOP 50 PERCENT CC 
      INTO #BOTTOM
      FROM   CHALLENGE
      ORDER  BY CC DESC

      SELECT 
            TOP 1 @topbottom=CAST(CC as numeric)
      FROM   #TOP X
      ORDER  BY CC DESC 

      SELECT 
        TOP 1 @bottomtop=CAST(CC as numeric)
       FROM   #BOTTOM Y
       ORDER  BY CC ASC

      SELECT @Mediana=
            CASE
                WHEN Count(CC) % 2 = 0 THEN (@bottomtop+@topbottom)/2
                ELSE @topbottom
              END 
       FROM   CHALLENGE

      SELECT TOP 1 
        @Moda= CC
        FROM
      (
      SELECT CC,Count(CC) AS Veces
       FROM   CHALLENGE
       GROUP  BY CC
       )
       ORDER  BY Veces


      SELECT
        Media=@Media,
        Mediana=@Mediana,
        Moda= @Moda,
        Minimo=Min(CC),
        Maximo=Max(CC)
      FROM   CHALLENGE

      drop table #top
      drop table #bottom
  END 
...