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