Estoy tratando de crear un procedimiento almacenado y escribí este código usando SQL Server, pero aparece el error

Solo se puede especificar una expresión en la lista de selección cuando la subconsulta no se introduce con EXISTS

Y no sé cómo resolverlo.

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
0
Juan Penaranda 13 sep. 2018 a las 00:01

3 respuestas

La mejor respuesta

Debe comenzar refactorizando su procedimiento almacenado en aras de la claridad.

Muestra para referencia a continuación

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 
0
DhruvJoshi 12 sep. 2018 a las 22:09

Esta parte de la consulta está causando un error.

Es una subconsulta y está intentando devolver 2 columnas (lo que causa el error).

TOP 1 CC y COUNT(CC)

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

No estoy seguro de qué sugerir porque seguramente eres el único que sabe lo que pretendías obtener de aquí.

0
piet.t 19 sep. 2018 a las 06:31

Debe cambiar su consulta y colocar todas las subconsultas en (APLICACIÓN EXTERIOR) unirse

Me gusta esto :

   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

Para cada subconsulta, use una combinación de aplicación externa y puede eliminar la línea de la cláusula where

0
علی میرزائی 13 sep. 2018 a las 05:26