Oscar me alegro que te haya servido el ejemplo

Saludos
PabloC
  ----- Original Message ----- 
  From: Oscar Onorato 
  To: pablo.canonico 
  Sent: Saturday, December 22, 2007 4:13 PM
  Subject: [dbms] Group By


  Pablo,

  Gracias, está muy claro el ejemplo.
  ¿Esto quiere decir que si bien no los calcula me está mostrando el resulset 
que necesito?
  Te pregunto esto porque una vez obtenida la consulta anterior, para 
asegurarme después probé haciendo un simple:

  SELECT COUNT(*) AS L1 FROM NombreTabla WHERE L1 LIKE 0

  Resultado:
  L1          
  ----------- 
  52

  Igual al que obtengo con el GROUP BY. Y, cuando le saco el TOP, de la 
consulta:

  SELECT L1, COUNT(*) AS Veces
  FROM NombreTabla 
  GROUP BY L1
  ORDER BY Veces DESC

  El resultado es el mismo, pero ordenado:

  L1          Veces       
  ----------- ----------- 
  0           52
  2           51
  1           45
  3           44
  4           42
  6           35
  5           28
  7           24 
  8           22
  10          16
  11          16
  9           14
  15          13
  12          11
  13          10
  14          8
  16          7
  18          6
  19          3
  21          2
  22          1 
  23          1
  26          1
  31          1
  20          1
  17          1

  En síntesis Pablo, ¿mi confusión era creer que había un cálculo cuando en 
realidad la consulta sólo ordenaba por orden de "apariciones"?

  ¿Muy loco esto de no necesitar ningún cálculo? La BD me termina ahorrando 
laburo de algoritmia complicada dentro de la aplicación.  =)

  Espero que sea como te acabo de consultar... Si es que me expliqué bien.

  Muchas gracias Pablo y "metete" las veces que tengas que hacerlo, muchas 
cabezas siempre piensan "x + 1", donde x = "cantidad de cabezas" =>  "x + 1" > 
x. Es decir, mejor.  

  =)

  Saludos

  El día 21/12/07, PabloC <[EMAIL PROTECTED]> escribió: 
    OScar perdon que me meta, pero con tu ejemplo no estan contando cuantas 
veces se repite el cero, esta contando cuantas veces se repite cada campo1, 
pero como lo ordenas por ese mismo campo y haces top1 y el valor es 0, es eso 
lo que vez que se repite 56 veces 
    Los group by no son tan complicados como te lo planteas, simplemente pensa 
que ORDENA todos los registros resultantes de tu consulta y luego los AGRUPA, 
algo asi
    Si tu consulta trae

    0    10
    1    5
    3    12
    0    8
    1    10

    Primero los ordena

    0    10
    0    8
    1    5
    1    10
    3    12

    y luego los junta, en ese caso sumando la 2da columna

      
    0    18
    1    15
    3    12

    OJO, no digo que el motor haga esto en esta forma, sino que es para que 
tengas una idea de como seria

    Saludos
    PabloC
      ----- Original Message ----- 
      From: Oscar Onorato 
      To: pablo.canonico 
      Sent: Friday, December 21, 2007 12:46 PM
      Subject: [dbms] Group By

       
        Gracias Maxi,

        En realidad veo que tengo un problema con la comprensión de cómo 
funcionan la consultas en T-SQL usadas generalmente para reporting.

        En este caso, no llego a entender cómo hace internamente SQL Server 
-2000 en este caso- para calcular todos los nºs del campo (con cerca de 800 
registros), simplemente con dos palabras clave dentro de la consulta en gral.: 

        SELECT TOP 1 Campo1, COUNT(*) AS Veces
        FROM NombreTabla
        GROUP BY Campo1
        ORDER BY Veces DESC

        Como había mandado en el primer email, el resultado de esta consulta es:

        Campo1  Veces
        -----------   -----------
        0            46

        Y cuando con otra consulta cuento la cantidad de veces que se repite el 
0 en ese mismo campo, son 46 como me tira la consulta de arriba. Pero no puedo 
razonar la consulta porque no llego a entender qué hace SQL server. Es decir, 
me gustaría saber cómo pensar las consultas de este tipo. 
        Quizás me falte conocer cómo pensarlas, pero no sé qué tengo que 
conocer primero.
        Es decir, no sé lo que me falta saber para entender el razonamiento de 
las consultas complejas y de reporting en gral.
        Las segundas se me complican mucho más que las primeras (por a los 
JOINS los puedo razonar, incluso cuando son consultas anidadas. Pero con el 
Group By según lo poco que pude leer opera de forma distinta según su contexto 
(las otras palabras clave dentro de la misma consulta). Por ejemplo, cuando 
tiene funciones de agregación, etc. En ese caso el resultado parece distinto. 

        Perdón por lo extenso de mi respuesta, pero la idea gral. es que no sé 
bien cómo pensar las consultas de reporting. Si me recomendas algun buen texto 
para comprender mejor este tipo consultas, sería buenísimo. QUizás me este 
equivocando, pero me parece que en el Group By SQL Server hace internamente 
cálculos que son tan transparentes que no puedo terminar de pensar la consulta 
de manera simple. 

        Nuevamente gracias Maxi, saludos.

         
      El día 21/12/07, Maxi Accotto <[EMAIL PROTECTED] > escribió:
        Hola OScar, como estas? no comprendo bien cual es tu duda, si queres
        saber como resolver la query o como funciona sql internamente para 
        hacerlo.

        Si vos queres hacer un where en agrupaciones necesitas usar having,
        entonces si queres saber cuales son los registros que tienen entre 0 y
        60 veces de datos repetidos deberias hacer algo como esto 


        SELECT  Campo1, COUNT(*) AS Veces
        FROM NombreTabla
        GROUP BY Campo1
        HAVING COUNT(*) < 60
        ORDER BY Veces DESC



        El 20/12/07, Oscar Onorato < [EMAIL PROTECTED]> escribió:
        >
        > Hola cumpas,
        >
        > Ya leí los Books On Line (me anticipio por algun iluminado que 
responda con
        > poca onda).
        > Pero necesito saber concretamente cómo opera en cada contexto. 
        >
        > En mi caso lo estoy necesitando en una consulta donde necesito saber 
cual es
        > el nº (entre 0 y 60) que se repite mayor cantidad de veces en un mismo
        > campo.
        >
        > Les paso el Stored Procedure que estoy, usando para campo individual. 
        >
        > SELECT TOP 1 Campo1, COUNT(*) AS Veces
        > FROM NombreTabla
        > GROUP BY Campo1
        > ORDER BY Veces DESC
        >
        > Este es el resultado actual:
        >
        > Campo1  Veces
        > -----------   ----------- 
        > 0            46
        >
        > No llego a entender qué hace Group By tras bambalinas, si calcula y 
si lo
        > hace cómo lo hace.
        > ¿El COUNT(*) determina el resultado del Group By?¿Cómo lo hace, como 
lo 
        > calcula?
        > Quizás sería bueno leer algo para entender consultas de este tipo 
desde cómo
        > las razonamos.
        >
        > Si me puede ayudar les voy a estar muy agradecido.
        >
        > Saludos y gracias 
        >
        >


        --
        -----------------------------------------------------------
        Microsoft MVP en SQL Server
        Mentor asociado en SQLTotalConsulting
        Excelencia en servicios y consultoria  SQLServer
        www.sqltotalconsulting.com
        -----------------------------------------------------------





Responder a