Urgente ! Referencias Cruzadas en sql server

15/06/2004 - 10:57 por JFBM | Informe spam
Hola!!

Pues me gustaria realizar una consulta de referencias
cruzadas en sql server.

tengo una tabla: clientes
cdg-cli
apellido1
apellido2

tabla cabecera de albaranes
numerodocumento
cdg-cli (llave ext)

tabla linea de albaranes:

numerodocument
pvp
neto
costo


pues me gustaria sacar los neto y costos de todos los
clientes cada mes desde 1/1/2004 al 1/06/2004

En Access hbia exo solo para los netos con la sentencia:

TRANSFORM Sum([pro1_rhiscab Consulta].[Suma De RHML-
prevta]) AS [SumaDeSuma De RHML-prevta]
SELECT [pro1_rhiscab Consulta].[GCLI-clialm],
[pro1_rhiscab Consulta].[GCLI-apel1], [pro1_rhiscab
Consulta].[GCLI-apel2], Sum([pro1_rhiscab Consulta].[Suma
De RHML-prevta]) AS [Total de Suma De RHML-prevta]
FROM [pro1_rhiscab Consulta]
GROUP BY [pro1_rhiscab Consulta].[GCLI-clialm],
[pro1_rhiscab Consulta].[GCLI-apel1], [pro1_rhiscab
Consulta].[GCLI-apel2]
PIVOT Format([RHML-fecmov],"mmm") In
("ene","feb","mar","abr","may","jun","jul","ago","sep","oct
","nov","dic");

Por no sigo con ACCESS porque las tablas de clientes son
15.000 reg, 60.000 de cabeceras y 180.000 reg de historial
de lineas de albaran. y he pensao que me iria mas rapido.
Las he importado del servidor a mi maquina un PII a 350
con 256 MB de RAM y claro los JOINS de esto es muy lento.

¿Que solucion me dais?
¿Algun listado parecido al que busco? ya sea en sql server
o en access

UN saludo

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
15/06/2004 - 13:39 | Informe spam
Hola,
Te mando un ejemplo de lo que necesitarías, tendrás que escribir más que en
Access, pero no desesperes, según nos contaron en la nueva versión de SQL
será más simple.
Saludos... Liliana.

select * from #clientes
create table #clientes
(cdg_cli smallint,
apellido1 varchar(10),
apellido2 varchar(10))
insert #clientes select 1, 'Ruiz', 'Garcia'
insert #clientes select 2, 'Bustos', 'Martinez'
insert #clientes select 3, 'Rodriguez', 'Matos'

select * from #cabecera_albaranes
create table #cabecera_albaranes
(numerodocumento smallint,
cdg_cli smallint,
fecha datetime)
insert #cabecera_albaranes select 10, 1, '20040101'
insert #cabecera_albaranes select 11, 1, '20040102'
insert #cabecera_albaranes select 20, 2, '20040202'
insert #cabecera_albaranes select 21, 2, '20040402'
insert #cabecera_albaranes select 30, 3, '20040602'
insert #cabecera_albaranes select 31, 3, '20040702'
insert #cabecera_albaranes select 32, 3, '20041002'

select * from #albaranes
create table #albaranes
(numerodocumento smallint,
pvp smallint,
neto smallint,
costo smallint)
insert #albaranes select 10, 100, 110, 120
insert #albaranes select 11, 200, 210, 220
insert #albaranes select 20, 300, 310, 320
insert #albaranes select 21, 400, 410, 420
insert #albaranes select 31, 500, 510, 520
insert #albaranes select 32, 600, 610, 620
insert #albaranes select 30, 700, 710, 720


select c.cdg_cli, apellido1, apellido2,
sum(case when month(fecha) = 01 then neto else 0 end) as NetoEne,
sum(case when month(fecha) = 01 then costo else 0 end) as CostoEne,
sum(case when month(fecha) = 02 then neto else 0 end) as NetoFeb,
sum(case when month(fecha) = 02 then costo else 0 end) as CostoFeb,
sum(case when month(fecha) = 03 then neto else 0 end) as NetoMar,
sum(case when month(fecha) = 03 then costo else 0 end) as CostoMar,
sum(case when month(fecha) = 04 then neto else 0 end) as NetoAbr,
sum(case when month(fecha) = 04 then costo else 0 end) as CostoAbr,
sum(case when month(fecha) = 05 then neto else 0 end) as NetoMay,
sum(case when month(fecha) = 05 then costo else 0 end) as CostoMay,
sum(case when month(fecha) = 06 then neto else 0 end) as NetoJun,
sum(case when month(fecha) = 06 then costo else 0 end) as CostoJun,
sum(case when month(fecha) = 07 then neto else 0 end) as NetoJul,
sum(case when month(fecha) = 07 then costo else 0 end) as CostoJul,
sum(case when month(fecha) = 08 then neto else 0 end) as NetoAgo,
sum(case when month(fecha) = 08 then costo else 0 end) as CostoAgo,
sum(case when month(fecha) = 09 then neto else 0 end) as NetoSet,
sum(case when month(fecha) = 09 then costo else 0 end) as CostoSet,
sum(case when month(fecha) = 10 then neto else 0 end) as NetoOct,
sum(case when month(fecha) = 10 then costo else 0 end) as CostoOct,
sum(case when month(fecha) = 11 then neto else 0 end) as NetoNov,
sum(case when month(fecha) = 11 then costo else 0 end) as CostoNov,
sum(case when month(fecha) = 12 then neto else 0 end) as NetoDic,
sum(case when month(fecha) = 12 then costo else 0 end) as CostoDic
from #clientes c
inner join #cabecera_albaranes ca on ca.cdg_cli = c.cdg_cli
inner join #albaranes a on a.numerodocumento = ca.numerodocumento
group by c.cdg_cli, apellido1, apellido2

"JFBM" escribió en el mensaje
news:1cb7401c452b6$d808aff0$
Hola!!

Pues me gustaria realizar una consulta de referencias
cruzadas en sql server.

tengo una tabla: clientes
cdg-cli
apellido1
apellido2

tabla cabecera de albaranes
numerodocumento
cdg-cli (llave ext)

tabla linea de albaranes:

numerodocument
pvp
neto
costo


pues me gustaria sacar los neto y costos de todos los
clientes cada mes desde 1/1/2004 al 1/06/2004

En Access hbia exo solo para los netos con la sentencia:

TRANSFORM Sum([pro1_rhiscab Consulta].[Suma De RHML-
prevta]) AS [SumaDeSuma De RHML-prevta]
SELECT [pro1_rhiscab Consulta].[GCLI-clialm],
[pro1_rhiscab Consulta].[GCLI-apel1], [pro1_rhiscab
Consulta].[GCLI-apel2], Sum([pro1_rhiscab Consulta].[Suma
De RHML-prevta]) AS [Total de Suma De RHML-prevta]
FROM [pro1_rhiscab Consulta]
GROUP BY [pro1_rhiscab Consulta].[GCLI-clialm],
[pro1_rhiscab Consulta].[GCLI-apel1], [pro1_rhiscab
Consulta].[GCLI-apel2]
PIVOT Format([RHML-fecmov],"mmm") In
("ene","feb","mar","abr","may","jun","jul","ago","sep","oct
","nov","dic");

Por no sigo con ACCESS porque las tablas de clientes son
15.000 reg, 60.000 de cabeceras y 180.000 reg de historial
de lineas de albaran. y he pensao que me iria mas rapido.
Las he importado del servidor a mi maquina un PII a 350
con 256 MB de RAM y claro los JOINS de esto es muy lento.

¿Que solucion me dais?
¿Algun listado parecido al que busco? ya sea en sql server
o en access

UN saludo
Respuesta Responder a este mensaje
#2 JFBM
16/06/2004 - 00:08 | Informe spam
Pues eso funciona a las mil maravillas, pero...mira en mi
base de datos tengo por cada linea de albaranes un campo
que me dice si es un cargo o un abono (es decir cargo =
saldo positivo y abono seria negativo) pero esos saldos
(neto y costo son positivos) por lo que me gustaria saber
si con ese select puedo poner una condicion para que haga
esto:

sum(case when month(fecha) = 01 then
if campo = 1 (seria cargo)
((neto*cantidad)-((neto*cantidad)*(dto/100)))
else (seria abono)
((neto*(-cantidad))-((neto*(-cantidad))*(dto/100)))

else 0 end) as NetoEne,
..
(y asi con las demas lineas)

pero me da error con el if...

¿como puedo juntar ese select magnifico con ...una
pequeña condicion para que me sume una cosa u otra?

¿Un procedimiento o funcion...es que de eso toy un poco
verde? ¿puedes darme una guia de como se haria?

Un saludo Liliana

Hola,
Te mando un ejemplo de lo que necesitarías, tendrás que


escribir más que en
Access, pero no desesperes, según nos contaron en la


nueva versión de SQL
será más simple.
Saludos... Liliana.

select * from #clientes
create table #clientes
(cdg_cli smallint,
apellido1 varchar(10),
apellido2 varchar(10))
insert #clientes select 1, 'Ruiz', 'Garcia'
insert #clientes select 2, 'Bustos', 'Martinez'
insert #clientes select 3, 'Rodriguez', 'Matos'

select * from #cabecera_albaranes
create table #cabecera_albaranes
(numerodocumento smallint,
cdg_cli smallint,
fecha datetime)
insert #cabecera_albaranes select 10, 1, '20040101'
insert #cabecera_albaranes select 11, 1, '20040102'
insert #cabecera_albaranes select 20, 2, '20040202'
insert #cabecera_albaranes select 21, 2, '20040402'
insert #cabecera_albaranes select 30, 3, '20040602'
insert #cabecera_albaranes select 31, 3, '20040702'
insert #cabecera_albaranes select 32, 3, '20041002'

select * from #albaranes
create table #albaranes
(numerodocumento smallint,
pvp smallint,
neto smallint,
costo smallint)
insert #albaranes select 10, 100, 110, 120
insert #albaranes select 11, 200, 210, 220
insert #albaranes select 20, 300, 310, 320
insert #albaranes select 21, 400, 410, 420
insert #albaranes select 31, 500, 510, 520
insert #albaranes select 32, 600, 610, 620
insert #albaranes select 30, 700, 710, 720


select c.cdg_cli, apellido1, apellido2,
sum(case when month(fecha) = 01 then neto else 0 end)


as NetoEne,
sum(case when month(fecha) = 01 then costo else 0 end)


as CostoEne,
sum(case when month(fecha) = 02 then neto else 0 end)


as NetoFeb,
sum(case when month(fecha) = 02 then costo else 0 end)


as CostoFeb,
sum(case when month(fecha) = 03 then neto else 0 end)


as NetoMar,
sum(case when month(fecha) = 03 then costo else 0 end)


as CostoMar,
sum(case when month(fecha) = 04 then neto else 0 end)


as NetoAbr,
sum(case when month(fecha) = 04 then costo else 0 end)


as CostoAbr,
sum(case when month(fecha) = 05 then neto else 0 end)


as NetoMay,
sum(case when month(fecha) = 05 then costo else 0 end)


as CostoMay,
sum(case when month(fecha) = 06 then neto else 0 end)


as NetoJun,
sum(case when month(fecha) = 06 then costo else 0 end)


as CostoJun,
sum(case when month(fecha) = 07 then neto else 0 end)


as NetoJul,
sum(case when month(fecha) = 07 then costo else 0 end)


as CostoJul,
sum(case when month(fecha) = 08 then neto else 0 end)


as NetoAgo,
sum(case when month(fecha) = 08 then costo else 0 end)


as CostoAgo,
sum(case when month(fecha) = 09 then neto else 0 end)


as NetoSet,
sum(case when month(fecha) = 09 then costo else 0 end)


as CostoSet,
sum(case when month(fecha) = 10 then neto else 0 end)


as NetoOct,
sum(case when month(fecha) = 10 then costo else 0 end)


as CostoOct,
sum(case when month(fecha) = 11 then neto else 0 end)


as NetoNov,
sum(case when month(fecha) = 11 then costo else 0 end)


as CostoNov,
sum(case when month(fecha) = 12 then neto else 0 end)


as NetoDic,
sum(case when month(fecha) = 12 then costo else 0 end)


as CostoDic
from #clientes c
inner join #cabecera_albaranes ca on ca.cdg_cli =


c.cdg_cli
inner join #albaranes a on a.numerodocumento =


ca.numerodocumento
group by c.cdg_cli, apellido1, apellido2

"JFBM" escribió en


el mensaje
news:1cb7401c452b6$d808aff0$
Hola!!

Pues me gustaria realizar una consulta de referencias
cruzadas en sql server.

tengo una tabla: clientes
cdg-cli
apellido1
apellido2

tabla cabecera de albaranes
numerodocumento
cdg-cli (llave ext)

tabla linea de albaranes:

numerodocument
pvp
neto
costo


pues me gustaria sacar los neto y costos de todos los
clientes cada mes desde 1/1/2004 al 1/06/2004

En Access hbia exo solo para los netos con la sentencia:

TRANSFORM Sum([pro1_rhiscab Consulta].[Suma De RHML-
prevta]) AS [SumaDeSuma De RHML-prevta]
SELECT [pro1_rhiscab Consulta].[GCLI-clialm],
[pro1_rhiscab Consulta].[GCLI-apel1], [pro1_rhiscab
Consulta].[GCLI-apel2], Sum([pro1_rhiscab Consulta].[Suma
De RHML-prevta]) AS [Total de Suma De RHML-prevta]
FROM [pro1_rhiscab Consulta]
GROUP BY [pro1_rhiscab Consulta].[GCLI-clialm],
[pro1_rhiscab Consulta].[GCLI-apel1], [pro1_rhiscab
Consulta].[GCLI-apel2]
PIVOT Format([RHML-fecmov],"mmm") In



("ene","feb","mar","abr","may","jun","jul","ago","sep","oc
t
","nov","dic");

Por no sigo con ACCESS porque las tablas de clientes son
15.000 reg, 60.000 de cabeceras y 180.000 reg de


historial
de lineas de albaran. y he pensao que me iria mas rapido.
Las he importado del servidor a mi maquina un PII a 350
con 256 MB de RAM y claro los JOINS de esto es muy lento.

¿Que solucion me dais?
¿Algun listado parecido al que busco? ya sea en sql


server
o en access

UN saludo


.

Respuesta Responder a este mensaje
#3 Javier Loria
16/06/2004 - 05:47 | Informe spam
Hola:
No son Lilliana, pero espero ser otros :D
No puedes usar IF o IIF pero si puedes usar CASE Anidado:
==SELECT ...
, SUM(CASE
WHEN MONTH(Fecha)='01'
THEN CASE
WHEN Campo=1
THEN ((neto*cantidad)-((neto*cantidad)*(dto/100)))
ELSE -- Seria Abono

(neto*(-cantidad))-((neto*(-cantidad))*(dto/100)))
END
WHEN MONTH(Fecha)='02'
THEN ...
END)
==En general estas construcciones son demasiado complejas y dificiles de
mantener, lo mejor en este caso es cambiar el CASE por la otra forma:
==SELECT
, SUM(CASE
WHEN Month(Fecha)='01' AND Campo=1 THEN
WHEN Month(Fecha)='01' THEN
WHEN Month(Fecha)='02' AND Campo=1 THEN ...
END)
== El case se procesa secuencialmente y de la primera condicion verdadera
se obtiene el WHEN.
Esta construccion es mas sencilla y mas facil de entender.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
JFBM escribio:
Pues eso funciona a las mil maravillas, pero...mira en mi
base de datos tengo por cada linea de albaranes un campo
que me dice si es un cargo o un abono (es decir cargo > saldo positivo y abono seria negativo) pero esos saldos
(neto y costo son positivos) por lo que me gustaria saber
si con ese select puedo poner una condicion para que haga
esto:

sum(case when month(fecha) = 01 then
if campo = 1 (seria cargo)
((neto*cantidad)-((neto*cantidad)*(dto/100)))
else (seria abono)
((neto*(-cantidad))-((neto*(-cantidad))*(dto/100)))

else 0 end) as NetoEne,
..
(y asi con las demas lineas)

pero me da error con el if...

¿como puedo juntar ese select magnifico con ...una
pequeña condicion para que me sume una cosa u otra?

¿Un procedimiento o funcion...es que de eso toy un poco
verde? ¿puedes darme una guia de como se haria?

Un saludo Liliana

Hola,
Te mando un ejemplo de lo que necesitarías, tendrás que escribir más
que en Access, pero no desesperes, según nos contaron en la nueva
versión de SQL será más simple.
Saludos... Liliana.

select * from #clientes
create table #clientes
(cdg_cli smallint,
apellido1 varchar(10),
apellido2 varchar(10))
insert #clientes select 1, 'Ruiz', 'Garcia'
insert #clientes select 2, 'Bustos', 'Martinez'
insert #clientes select 3, 'Rodriguez', 'Matos'

select * from #cabecera_albaranes
create table #cabecera_albaranes
(numerodocumento smallint,
cdg_cli smallint,
fecha datetime)
insert #cabecera_albaranes select 10, 1, '20040101'
insert #cabecera_albaranes select 11, 1, '20040102'
insert #cabecera_albaranes select 20, 2, '20040202'
insert #cabecera_albaranes select 21, 2, '20040402'
insert #cabecera_albaranes select 30, 3, '20040602'
insert #cabecera_albaranes select 31, 3, '20040702'
insert #cabecera_albaranes select 32, 3, '20041002'

select * from #albaranes
create table #albaranes
(numerodocumento smallint,
pvp smallint,
neto smallint,
costo smallint)
insert #albaranes select 10, 100, 110, 120
insert #albaranes select 11, 200, 210, 220
insert #albaranes select 20, 300, 310, 320
insert #albaranes select 21, 400, 410, 420
insert #albaranes select 31, 500, 510, 520
insert #albaranes select 32, 600, 610, 620
insert #albaranes select 30, 700, 710, 720


select c.cdg_cli, apellido1, apellido2,
sum(case when month(fecha) = 01 then neto else 0 end) as NetoEne,
sum(case when month(fecha) = 01 then costo else 0 end) as CostoEne,
sum(case when month(fecha) = 02 then neto else 0 end) as NetoFeb,
sum(case when month(fecha) = 02 then costo else 0 end) as CostoFeb,
sum(case when month(fecha) = 03 then neto else 0 end) as NetoMar,
sum(case when month(fecha) = 03 then costo else 0 end) as CostoMar,
sum(case when month(fecha) = 04 then neto else 0 end) as NetoAbr,
sum(case when month(fecha) = 04 then costo else 0 end) as CostoAbr,
sum(case when month(fecha) = 05 then neto else 0 end) as NetoMay,
sum(case when month(fecha) = 05 then costo else 0 end) as CostoMay,
sum(case when month(fecha) = 06 then neto else 0 end) as NetoJun,
sum(case when month(fecha) = 06 then costo else 0 end) as CostoJun,
sum(case when month(fecha) = 07 then neto else 0 end) as NetoJul,
sum(case when month(fecha) = 07 then costo else 0 end) as CostoJul,
sum(case when month(fecha) = 08 then neto else 0 end) as NetoAgo,
sum(case when month(fecha) = 08 then costo else 0 end) as CostoAgo,
sum(case when month(fecha) = 09 then neto else 0 end) as NetoSet,
sum(case when month(fecha) = 09 then costo else 0 end) as CostoSet,
sum(case when month(fecha) = 10 then neto else 0 end) as NetoOct,
sum(case when month(fecha) = 10 then costo else 0 end) as CostoOct,
sum(case when month(fecha) = 11 then neto else 0 end) as NetoNov,
sum(case when month(fecha) = 11 then costo else 0 end) as CostoNov,
sum(case when month(fecha) = 12 then neto else 0 end) as NetoDic,
sum(case when month(fecha) = 12 then costo else 0 end) as CostoDic
from #clientes c
inner join #cabecera_albaranes ca on ca.cdg_cli = c.cdg_cli
inner join #albaranes a on a.numerodocumento = ca.numerodocumento
group by c.cdg_cli, apellido1, apellido2

"JFBM" escribió en el mensaje
news:1cb7401c452b6$d808aff0$
Hola!!

Pues me gustaria realizar una consulta de referencias
cruzadas en sql server.

tengo una tabla: clientes
cdg-cli
apellido1
apellido2

tabla cabecera de albaranes
numerodocumento
cdg-cli (llave ext)

tabla linea de albaranes:

numerodocument
pvp
neto
costo


pues me gustaria sacar los neto y costos de todos los
clientes cada mes desde 1/1/2004 al 1/06/2004

En Access hbia exo solo para los netos con la sentencia:

TRANSFORM Sum([pro1_rhiscab Consulta].[Suma De RHML-
prevta]) AS [SumaDeSuma De RHML-prevta]
SELECT [pro1_rhiscab Consulta].[GCLI-clialm],
[pro1_rhiscab Consulta].[GCLI-apel1], [pro1_rhiscab
Consulta].[GCLI-apel2], Sum([pro1_rhiscab Consulta].[Suma
De RHML-prevta]) AS [Total de Suma De RHML-prevta]
FROM [pro1_rhiscab Consulta]
GROUP BY [pro1_rhiscab Consulta].[GCLI-clialm],
[pro1_rhiscab Consulta].[GCLI-apel1], [pro1_rhiscab
Consulta].[GCLI-apel2]
PIVOT Format([RHML-fecmov],"mmm") In



("ene","feb","mar","abr","may","jun","jul","ago","sep","oc
t
","nov","dic");

Por no sigo con ACCESS porque las tablas de clientes son
15.000 reg, 60.000 de cabeceras y 180.000 reg de historial
de lineas de albaran. y he pensao que me iria mas rapido.
Las he importado del servidor a mi maquina un PII a 350
con 256 MB de RAM y claro los JOINS de esto es muy lento.

¿Que solucion me dais?
¿Algun listado parecido al que busco? ya sea en sql server
o en access

UN saludo


.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida