Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Como Insertar info de una tabla en otra

Estas en el tema de Como Insertar info de una tabla en otra en el foro de SQL Server en Foros del Web. Tengo dos tablas: -----VentasAcumXDia------- Fecha NumSucursal CodigoInterno Piezas -----ReportVenDiarias------- CodigoInterno Descripcion NumSucursal Sucursal 1 <--------- Dias del mes 2 3 4 ... 31 <----------- Dias ...
  #1 (permalink)  
Antiguo 05/02/2008, 15:38
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Como Insertar info de una tabla en otra

Tengo dos tablas:

-----VentasAcumXDia-------
Fecha
NumSucursal
CodigoInterno
Piezas

-----ReportVenDiarias-------
CodigoInterno
Descripcion
NumSucursal
Sucursal
1 <--------- Dias del mes
2
3
4
...
31 <----------- Dias del mes

Lo que quiero es que mediante el NumSucursal y el CodigoInterno y con la ayuda del campo Fecha de la tabla VentasAcumXDia insertar el numero de Piezas en los campos de dias de la tabla ReportVenDiarias. O como quien dice el paso de info de una tabla a otra.

ejemplo:
si tengo esta info en la tabla VentasAcumXDia
fecha:02/01/2008
NumSucursal: 1
CodigoInterno: 19770
Piezas:25

por medio de esto hacer que en la tabla ReportVenDiarias se muestre

CodigoInterno ! NumSucursal ! 1 !
19770 - ------ ! 1 ---- --! 25 !

02/01/2008 <---- 1 de febrero de 2008 se registraron 25 piezas y por eso se pusieron en el campo de dia 1.

Espero explicarme bien , por el momento estoy buscando la solucion por mi cuenta, pero me esta dando dolores de cabeza, espero puedan ayudarme, agradecido de antemano. un saludo y que tengan un buen dia!!
  #2 (permalink)  
Antiguo 05/02/2008, 16:58
 
Fecha de Ingreso: agosto-2006
Mensajes: 34
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Ok, primero se puede decir que esta mal desde el principio, ya que se puede normalizar un poco las tablas y realizar de una mejor y fácil manera y asi evitarte todo este codigo que te voy a poner.

create table VentasAcumXDia (
Fecha varchar(12),
NumSucursal varchar(5),
CodigoInterno varchar(5),
Piezas varchar(3))



Create table ReportVenDiarias
(CodigoInterno varchar(5),
Descripcion varchar(10),
NumSucursal varchar(5),
Sucursal varchar(10),
Dia1 varchar(2),
Dia2 varchar(2),
Dia3 varchar(2))

insert into VentasAcumXDia values ('02/01/2008','1','19770','25')
insert into VentasAcumXDia values ('02/02/2008','1','19770','20')



Declare @Codigo varchar(5), @Num varchar(5), @dia varchar(2), @CantidadPiezas varchar(3)
declare @sentencia varchar(1000)
Declare c_Ven cursor
keyset
local
for
Select
CodigoInterno,
NumSucursal,
day(convert(datetime,fecha,101)) as Dia,
Sum(convert(int,Piezas)) as Total
From
VentasAcumXDia Group by CodigoInterno, NumSucursal, Fecha
Open c_Ven
FETCH NEXT FROM c_Ven
INTO @Codigo, @Num, @dia, @CantidadPiezas
WHILE @@FETCH_STATUS = 0
BEGIN

set @sentencia ='Insert into ReportVenDiarias (CodigoInterno, NumSucursal, Dia' + @dia +')
values ('+ @Codigo +','+ @Num +','+ @CantidadPiezas +')'
exec (@sentencia)

FETCH NEXT FROM c_Ven
INTO @Codigo, @Num, @dia, @CantidadPiezas
END
close c_Ven
Deallocate c_Ven


select * from VentasAcumXDia
select * from ReportVenDiarias


Otra cosa no pusiste con que lenguaje procedural estas trabajando , el ejemplo esta en T-SQL, por lo que solo difiere en las conversiones, el cursor y en la ejecucion de la variable @sentencia.

Además, no se cómo sea el negocio pero a primera vista, que no se debe de pasar la información de las ventas diarias al acumulado.

Bueno fué divertido, necesitaba un retito.

Saludos.

Última edición por Arkhel; 05/02/2008 a las 17:01 Razón: Agregar
  #3 (permalink)  
Antiguo 05/02/2008, 17:49
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Primero que nada gracias Arkhel, todo esto lo he realizado en el analizador de consultas de SQL Server, creo que a lo mejor esta en T-SQL mas el despliegue de algunos errores podria indicar que estoy equivocado, la verdad es que tengo menos de 3 semanas aprendiendo SQL asi que realmente no se mucho, estoy como quien dice en pañales, pero si uno quiere puede aprender es cuestion de actitud y compromiso, gracias por el codigo mas o menos pude analizarlo y tengo creo que la idea de lo que hace. Intentare buscar acerca de el analizador de consultas para ver si tengo que cambiar una que otra sintaxis.

A todo aquel que lee este threahd y tenga una idea de como solucionar este problema por favor hagalo, mientras tanto , gracias Arkhel por tu tiempo.
Saludos
  #4 (permalink)  
Antiguo 06/02/2008, 08:11
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: Como Insertar info de una tabla en otra

Otra alternativa...

Como recomendacion, eviten al maximo el uso de cursores, ya que SQL Server no esta diseñado para trabajar registro por registro, sino de forma masiva.

Draken, retome el ejemplo que te habia comentado para generar el select, solo me quedó la duda de que donde se obtiene el valor de descripcion (de que tabla) y lo tipos de datos de las tablas...

Agregar el resto de los dias sera muy facil, solo copiar el ultimo renglon y modificar el valor de dia = 4, = 5, etc....

Código:


create table Farmacias(
       cod_Farmacia  int
      ,Nom_Farmacia  varchar(50)
       )


create table VentasAcumXDia (
       Fecha         datetime    -- Considerando este campo como datetime
      ,NumSucursal   int
      ,CodigoInterno varchar(5)
      ,Piezas        int)        -- Este campo deberia ser numerico



Create table ReportVenDiarias(
       CodigoInterno varchar(5)
      ,Descripcion   varchar(10)
      ,NumSucursal   int
      ,Sucursal      varchar(50)
      ,Dia1          int      -- Estos campos deberian ser numericos
      ,Dia2          int
      ,Dia3          int)

insert into VentasAcumXDia values ('20080201',1,19770,'25')
insert into VentasAcumXDia values ('20080202',1,19770,'20')
insert into Farmacias values (1,'Farmacia 1')



Declare @fecha1 datetime

Set @fecha1 = '20080201'  -- Formato estandar de Fecha (YYYYMMDD)

Insert into ReportVenDiarias (CodigoInterno, Descripcion, NumSucursal, Sucursal, Dia1,Dia2,Dia3  )
Select  v.CodigoInterno 
       ,''              as Descripcion
       , v.NumSucursal   as NumSucursal
       ,f.Nom_Farmacia  as Sucursal
       ,Sum(Case When day(Fecha) = 1 Then Piezas Else 0 End) Dia1
       ,Sum(Case When day(Fecha) = 2 Then Piezas Else 0 End) Dia2
       ,Sum(Case When day(Fecha) = 3 Then Piezas Else 0 End) Dia2
From  Farmacias f
Inner join 
      VentasAcumXDia v
On    f.Cod_Farmacia = v.NumSucursal
Where CodigoInterno = 19770 And 
      v.Fecha >= @fecha1    And          
      v.Fecha <  dateadd(dd, 1, @fecha1) 
Group by
      v.CodigoInterno
     ,v.NumSucursal
     ,f.Nom_Farmacia


select * from VentasAcumXDia
select * from ReportVenDiarias
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #5 (permalink)  
Antiguo 06/02/2008, 11:16
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Buenos Dias primeramente a todos, aqui hay una pequeña info:

-Utilizo el Analizador de Consultas de SQL Server.
-Las tablas VentasAcumXDia y ReportVenDiarias ya estan creadas

----- VentasAcumXDia--------
Fecha ------> Datetime(8)
NumSucursal ------> Tinyint(1)
CodigoInterno -----> int(4)
Piezas---------> Money(8)

----- ReportVenDiarias---------
CodigoInterno-----> int(4)
Descripcion--------> varchar(100)
NumSucursal--------> Tinyint(1)
Sucursal-------->varchar(60)
1---------->Money(8) ---------
2--------->Money(8) -------------
3--------->Money(8) ------------------- EL nombre de estos campos que corresponden al dia es asi, el numero a secas.
...... ------------
31------->Money(8) ------------

Nota: Los tipos de campos pareceran algo incoherentes, pero tuve que crearlos asi, para que fueran compatibles con la base de datos ya creada aqui en la empresa donde trabajo.

La intencion es pasar la info del numero de Piezas que esta en la tabla VentasAcumXDia a los campos 1, 2, 3 de la tabla ReportVenDiarias dependiendo de la fecha(dia) de la tabla VentasAcumXDia.

Antes de seguir quiero agradecerles a los que me han ayudado , gracias Andres95 por el codigo le hize unas modificaciones y solo me arrojo los siguientes errores.

Primero que nada aqui les escribo el codigo

declare @fecha1 datetime
set @fecha1 = '20080201' ------------ yyyymmdd

Insert into ReportVenDiarias (CodigoInterno, Descripcion, NumSucursal, Sucursal, 1,2,3)

Select v.CodigoInterno as CodigoInterno
,c.Descripcion as Descripcion
,v.NumSucursal as NumSucursal
,f.Nom_Farmacia as Sucursal
,SUM(case when day(Fecha) = 1 then Piezas Else 0 End)1
,SUM(case when day(Fecha) = 2 then Piezas Else 0 End)2
,SUM(case when day(Fecha) = 3 then Piezas Else 0 End)3

From Farmacias f
Inner Join
VentasAcumXDia v
On f.Cod_Farmacia = v.NumSucursal
Inner Join
CatProductos c
On v.CodigoInterno = c.Codigo

where CodigoInterno = 19770 and
v.Fecha >= @fecha1 and
v.Fecha < dateadd(dd,1,@fecha1)

Group by
v.CodigoInterno
,c.Descripcion
,v.NumSucursal
,f.Nom_Farnmacia

Select * from VentasAcumXDia
Select * from ReportVenDiarias

Los errores que arrojan son los siguientes:

Servidor: Mensaje 170, nivel 15 estado 1, linea 5
Line5: Incorrect Syntax near '1'
Servidor: Mensaje 170, nivel 15, estado 1 , linea 10
Line10:Incorrecto Syntax near '1'

Por su atencion gracias, Saludos , que tengan un excelente dia
  #6 (permalink)  
Antiguo 06/02/2008, 12:05
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: Como Insertar info de una tabla en otra

El problema es que el alias es numerico.

Tienes dos opciones:

- Quitar los alias en el select que hace el insert, ya que no se requieren lo nombres y la info se insertaria en los campos correspondientes segun el orden en el que se seleccionan.
p.e.

SUM(case when day(Fecha) = 3 then Piezas Else 0 End)

- A todos ponerle el alias entre comillas o entre parentesis cuadrados p.e.
SUM(case when day(Fecha) = 3 then Piezas Else 0 End) '3'
o
SUM(case when day(Fecha) = 3 then Piezas Else 0 End) [3]


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #7 (permalink)  
Antiguo 06/02/2008, 12:14
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

declare @fecha1 datetime
set @fecha1 = '20080201' ------------ yyyymmdd

Insert into ReportVenDiarias (CodigoInterno, Descripcion, NumSucursal, Sucursal,[1],[2],[3])

Select v.CodigoInterno as CodigoInterno
,c.Descripcion as Descripcion
,v.NumSucursal as NumSucursal
,f.Nom_Farma as Sucursal
,SUM(case when day(Fecha) = 1 then Piezas Else 0 End)[1]
,SUM(case when day(Fecha) = 2 then Piezas Else 0 End)[2]
,SUM(case when day(Fecha) = 3 then Piezas Else 0 End)[3]

From Farmacias f
Inner Join
VentasAcumXDia v
On f.Cod_Farmacia = v.NumSucursal
Inner Join
CatProductos c
On v.CodigoInterno = c.Codigo

where CodigoInterno = 19770 and
v.Fecha >= @fecha1 and
v.Fecha < dateadd(dd,1,@fecha1)

Group by
v.CodigoInterno
,c.Descripcion
,v.NumSucursal
,f.Nom_Farnmacia

Select * from VentasAcumXDia
Select * from ReportVenDiarias

Asi es Andres95 hice exactamente eso, y ya no marco ningun error. Ahora el detalle esta en que me mostro lo siguiente

fecha, numsuc,codigointerno,piezas
aki si mostro todos los datos de esa tabla

pero

en la de reportvendiarias no agrego nada
me mostro lo siguiente

codigointerno, descripcion,numsucursal,sucursal,1,2,3,4.........3 1
pero solo me mostro eso los nombres de campos , no habia nada dentro de los registros.

Espero me puedan a ayudar a descifrar que ocurrio si el codigo ya no marca errores, yo investigare por mi cuenta tambien, agradecido de antemano por las molestias y su tiempo.
  #8 (permalink)  
Antiguo 07/02/2008, 08:09
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Primero que nada muy buenos dias tengan todos, he estado buscando detalles en el codigo que esta en el post de arriba, acerca de como insertar datos de una tabla a otra, y no encuentro el porque no inserta los datos como deberia, el codigo parece estar bien , no hay errores de sintaxis ni nada por el estilo, asi que agradeceria mucho si alguien puede ayudarme a encontrar cual es el detalle, de antemano muchas gracias por su tiempo, un saludo para todos de nueva cuenta.
  #9 (permalink)  
Antiguo 07/02/2008, 09:25
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Re: Como Insertar info de una tabla en otra

Seguramente no inserta nada porque no consulta nada.

Para asegurarte de que existe info, ejecuta el select, sin el insert y verifica tus tablas para comprobar que exista informacion que conicida con el where y los joins de tu select...

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #10 (permalink)  
Antiguo 07/02/2008, 12:38
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Buen punto Andres95 , he hecho lo que dijiste quitandole la linea que involucra el insert, lo cual hace que el codigo quede de la siguiente manera:

declare @fecha1 datetime
set @fecha1 = '20080201' ------------ yyyymmdd

Select v.CodigoInterno as CodigoInterno
,c.Descripcion as Descripcion
,v.NumSucursal as NumSucursal
,f.Nom_Farma as Sucursal
,SUM(case when day(Fecha) = 1 then Piezas Else 0 End)[1]
,SUM(case when day(Fecha) = 2 then Piezas Else 0 End)[2]
,SUM(case when day(Fecha) = 3 then Piezas Else 0 End)[3]

From Farmacias f
Inner Join
VentasAcumXDia v
On f.Cod_Farmacia = v.NumSucursal
Inner Join
CatProductos c
On v.CodigoInterno = c.Codigo

where CodigoInterno = 19770 and
v.Fecha >= @fecha1 and
v.Fecha < dateadd(dd,1,@fecha1)

Group by
v.CodigoInterno
,c.Descripcion
,v.NumSucursal
,f.Nom_Farnmacia

Halle algo muy curioso que tiene que ver con la siguiente linea del codigo anterior.

v.Fecha < dateadd(dd,1,@fecha1) <----- En este caso la consulta no despliega nada

Pero

v.Fecha < dateadd(dd,2,@fecha1)
v.Fecha < dateadd(dd,3,@fecha1)
v.Fecha < dateadd(dd,5,@fecha1)

En estos casos la consulta despliega el mismo resultado que es:

CodigoInterno!Descripcion!NumSucursal!Sucursal! --- 1 -- ! --- 2 --- ! --- 3 --- !
19770 ----- GalletasO ---- 1 ----- --- Matriz -- .0000 --22.0000 -- .0000
19770 ------ GalletasO ---- 2 -------- Matriz -- .0000 -- 5.0000 -- .0000
19770 ----- GalletasO ---- 3 ---- ---- Matriz -- .0000 -- 1.0000 --.0000

los datos insertados en la columna 2 son correctos, pero solo inserta el numero de piezas de ese dia.

no importa si modifico esa linea de esta manera
v.Fecha < dateadd(dd,3,@fecha1) o v.Fecha < dateadd(dd,4,@fecha1) o etc
muestra lo mismo solamente inserta los datos que son los correctos para el dia 2 , pero los demas dias los pone en 0, siendo que si hay piezas vendidas ese dia.

2008/02/01 --- 1---- 19770-------13
2008/02/01 ----2-----19770--------7
2008/02/01 ----3-----19770--------1
2008/02/02 --- 1---- 19770-------22
2008/02/02 ----2-----19770--------5
2008/02/02 ----3-----19770--------1
2008/02/03 --- 1---- 19770-------16
2008/02/03 ----2-----19770--------3
2008/02/03 ----3-----19770--------1

La info de arriba , es la info que se encuentra en la tabla VentasAcumXDia, viendola podemos notar que el codigo en el caso del dia 2 si hace lo correcto puesto las cantidades son las que se vendieron ese dia, el detalle es que no importa que dia ponga en la linea escrita arribita solo inserta lo del dia 2 y no hace nada con los otros dias.


Espero contar con su ayuda para ver que es lo que esta pasando con este detalle, de nueva cuenta gracias por su tiempo.
Saludos

Última edición por DrakenRG; 07/02/2008 a las 12:47 Razón: extender un pokito mas
  #11 (permalink)  
Antiguo 08/02/2008, 08:43
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Buenos dias, quisiera saber que hace en si las siguientes lineas, porque no tengo muy claro que es lo que hacen.
,SUM(case when day(Fecha) = 1 then Piezas Else 0 End)[1]
,SUM(case when day(Fecha) = 2 then Piezas Else 0 End)[2]
,SUM(case when day(Fecha) = 3 then Piezas Else 0 End)[3]
y
v.Fecha >= @fecha1 and
v.Fecha < dateadd(dd,1,@fecha1)

Agradecido de antemano por su tiempo y atencion les deseo un buen dia
Saludos
  #12 (permalink)  
Antiguo 08/02/2008, 12:20
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Como Insertar info de una tabla en otra

DrakenRG

Aqui, se hace una SUMA y se separa por cada dia de la semana (lun, mar, mie, juev, etc)

,SUM(case when day(Fecha) = 1 then Piezas Else 0 End)[1]
,SUM(case when day(Fecha) = 2 then Piezas Else 0 End)[2]
,SUM(case when day(Fecha) = 3 then Piezas Else 0 End)[3]

Aqui se compara la columna v.Fecha que sea MAYOR O IGUAL al contenido de la variable @fecha1

v.Fecha >= @fecha1

Y, ademas que sea, MENOR o IGUAL, al contenido de la variable @fecha1, sumandole a DIA, 1

and
v.Fecha < dateadd(dd,1,@fecha1)
  #13 (permalink)  
Antiguo 09/02/2008, 10:56
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Gracias por la explicacion. es curioso como un simple tema pueda tener a uno ya dos dias intentando encontrarle la solucion, pero el detalle esta en no rendirse, seguire buscando el porque solo inserta los datos en el campo 2 de los dias. cualquiera que le heche un ojo y tenga mas nociones y pueda encontrar un porque , le agradeceria mucho que posteara.
Agradecido de antemano , un saludo y que tengan buen dia
  #14 (permalink)  
Antiguo 12/02/2008, 10:28
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Muy buenos dias a todo el que lee esto. he estado tratando de encontrar una solucion a este problema, pero hasta ahora solo he podido descubrir lo siguiente.

En el codigo la fecha se maneja de la siguiente forma:
--------------------------------------------------------------------------------
declare @fecha1 datetime
set @fecha1 = '20080201' ------------ yyyymmdd
---------------------------------------------------------------------------------
Sinembargo a la hora de ejecutar el codigo en el analizador de Consultas, me di cuenta que me interpreta la fecha de la siguiente manera:
yyyyddmm

Es decir que 20080102 lo interpreta como el primero de feberero.

Otro dato curioso es que en mi Tabla AcumVentasXDia la fecha tiene el siguiente formato:

mmddyyyy
02/01/2008
----------------------------------------------------------------------------------------------------------------------
A que voy con todo esto, a continuacion se los explicare:

Al utilizar en el codigo el formato yyyyddmm , al ejecutar la consulta se despliegan los datos del dia, pero no importa que dia yo ponga se desplegara la info de ese dia pero siempre en el campo '2' , los demas dias siempre quedan en 0s.

No se que ocurra en los case, porque no esta tomando en cuenta el 1 ,3....... 31 y solo este desplegando la info en el campo '2'.

Aqui les mostrare un ejemplo de lo que me refiero:

Cuando utilizo 20080102 <---- formato yyyyddmm

CodigoInterno!Descripcion!NumSucursal!Sucursal! --- 1 -- ! --- 2 --- ! --- 3 --- !
19770 ----- GalletasO ---- 1 ----- --- Matriz -- .0000 --13.0000 -- .0000
19770 ------ GalletasO ---- 2 -------- Matriz -- .0000 -- 7.0000 -- .0000
19770 ----- GalletasO ---- 3 ---- ---- Matriz -- .0000 -- 1.0000 --.0000

Estos datos son los correctos pero deberian ir en el dia 1

cuando utilizo 20080202 <------------YYYYDDMM

CodigoInterno!Descripcion!NumSucursal!Sucursal! --- 1 -- ! --- 2 --- ! --- 3 --- !
19770 ----- GalletasO ---- 1 ----- --- Matriz -- .0000 --22.0000 -- .0000
19770 ------ GalletasO ---- 2 -------- Matriz -- .0000 -- 5.0000 -- .0000
19770 ----- GalletasO ---- 3 ---- ---- Matriz -- .0000 -- 1.0000 --.0000

Esta info es la correcta para el dia 2 y si la despliega ahi en el campo 2, pero porque todo lo despliega en ese campo.

Si utilizo 2008/03/02 <-----------YYYYDDMM

CodigoInterno!Descripcion!NumSucursal!Sucursal! --- 1 -- ! --- 2 --- ! --- 3 --- !
19770 ----- GalletasO ---- 1 ----- --- Matriz -- .0000 --16.0000 -- .0000
19770 ------ GalletasO ---- 2 -------- Matriz -- .0000 -- 3.0000 -- .0000
19770 ----- GalletasO ---- 3 ---- ---- Matriz -- .0000 -- 1.0000 --.0000

La informacion correcta del dia 3 pero la despliega en el campo 2.

Es por eso que digo no importa que dia sea, no se que pasa en los case que omite todos los demas y solamente pasa la info al campo '2' .

Por si se preguntan que pasa si utilizo el formato YYYYMMDD , la respuesta es , no muestra la informacion , solo regresa el nombre de los campos.

Espero explicarme bien, en verdad que me gustaria saber mas de SQL y no molestarles, recurro a ustedes porque obviamente saben mucho mas que yo y porque tambien a lo mejor varias personas pueden tener problemas similares.
Espero puedan ayudarme en verdad les agradeceria mucho, gracias por su atencion y disculpas por dar tanta lata
Saludos!!!
  #15 (permalink)  
Antiguo 12/02/2008, 16:00
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Como Insertar info de una tabla en otra

20080102: 2 de Enero
20080202: 2 de Febrero
2008/03/02: No deberías usar un formato como este, pero se debe interpretar como 2 de marzo.

Evidentemente, la función DAY() retornará 2 para todas las cadenas anteriores, motivo por el cual los resultados se muestran en la columna 2.
Ahora, ¿por qué no las pone donde deberían estar? Porque probablemente el campo Fecha de VentasAcumXDia no es DATETIME, sino CHAR o VARCHAR. ¿Verificaste que dicho campo sea realmente de fecha?
Código:
EXECUTE SP_HELP 'VentasAcumXDia'
  #16 (permalink)  
Antiguo 12/02/2008, 17:47
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Gracias por la ayuda Beakdan.
Ingrese el codigo = Execute SP_HELP 'VentasAcumXDia'

Esto es lo que desplego:

! Column_name ! Type ! Computed ! Lenght !
---------------------------------------------------------------------
Fecha ------ Datetime ------ no ----- 8

El campo si es Datetime(8), pero por lo que me comentas creo que el detalle esta en que el formato de la tabla es MMDDYYYY y el del codigo difieren.
EL codigo no tiene errores de sintaxis, pero he estado buscando por 3 dias y no encuentro otro problema.

Tu que opinas Beakdan o que opina cualquiera que lea este thread y tenga mas o menos la idea de que es lo que pasa o mejor aun como solucionarlo.

Una vez mas les agradezco su tiempo y las molestias que se toman
Saludos!!
  #17 (permalink)  
Antiguo 12/02/2008, 19:34
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Como Insertar info de una tabla en otra

Pues, efectivamente es DATETIME, entonces, es irrelevante el formato con el que veas en pantalla la fecha.
Entonces, la manera en que se comporta la consulta es perfectamente válida.
Para mostrar los datos del día uno de febrero la fecha debe ser '20080201' y para el día tres '20080203' sin lugar a dudas. Si no muestra nada, es porque no debe haber nada en esos días.
Antes de hacer todo el proceso de pivote en los días, deberías verificar que existan los datos que te interesan. Una consulta que agrupe también por fecha te mostraría si existen los datos como crees. Pero, vamos por partes: Primero la parte relacional, es decir primero obten las cifras que esperas y al final decoras la información con sus descripciones:

Código:
DECLARE        @fecha1 DATETIME
SET            @fecha1 = '20080201'
 
SELECT        CodigoInterno AS CodigoInterno,
            NumSucursal AS NumSucursal,
            CONVERT(CHAR(8), Fecha, 112) AS Fecha
FROM        VentasAcumXDia
WHERE        CodigoInterno = 19770
            AND Fecha >= @fecha1
            AND Fecha < DATEADD(mm,1,@fecha1)
GROUP BY    CodigoInterno, v.NumSucursal,
            CONVERT(CHAR(8), Fecha, 112)
La anterior consulta... ¿entrega información para todos los días que dices tener? Nota además que está seleccionando un mes como rango, puesto que quieres sumar para cada uno de los días del mes ¿no? Si sólo vas por un día, no puedes esperar que los demás tengan información. Supongo que en el mes de enero tienes información completa para el mes, prueba con '20080101'

Última edición por Beakdan; 14/02/2008 a las 13:24
  #18 (permalink)  
Antiguo 13/02/2008, 10:18
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Buenos Dias a todos los que lean este threat, en especial a Beakdan y a Andres95 que me han estado ayudando.

Beakdan con el codigo que pusiste:

DECLARE @fecha1 DATETIME
SET @fecha1 = '20080201'

SELECT CodigoInterno AS CodigoInterno,
NumSucursal AS NumSucursal,
CONVERT(CHAR(8), Fecha, 112) AS Fecha
FROM VentasAcumXDia
WHERE CodigoInterno = 19770
AND Fecha >= @fecha1
AND Fecha < DATEADD(mm,1,@fecha1)
GROUP BY CodigoInterno, v.NumSucursal,
CONVERT(CHAR(8), Fecha, 112)

El resultado que arrojo la consulta fue el siguiente:

CodigoInterno NumSucursal Fecha
19770 --- --- - 1 - -- --- 20080202
19770 --- --- - 2 -- - --- 20080202
19770 --- --- - 3 --- --- 20080202

Con respecto a la informacion, la tabla VentasAcumXDia contiene toda la info desde el 1ero de Febrero hasta el 11 de Febrero.
utilizando el siguiente codigo:

Select *
From VentasAcumXDia
where CodigoInterno = 19770

Despliega lo siguiente:

Fecha ------------ ----- NumSucursal ------- CodigoInterno ------- Piezas
2008-01-02 00:00:00.000 --- -- 1 --------------- 19770 ---------- 13.000
2008-01-02 00:00:00.000 - -- -- 2 ---- ----------- 19770 ---- ------ 7.000
2008-01-02 00:00:00.000 --- -- 3 ---- ----------- 19770 ---------- 1.000
2008-01-02 00:00:00.000 --- -- 4 ---- ----------- 19770 ---- ------ 2.000
2008-02-02 00:00:00.000 --- -- 1 ---- ---- ------- 19770 ---- ------ 22.000
2008-02-02 00:00:00.000 --- -- 2 ---- ---- ------- 19770 ---- ------ 5.000
2008-02-02 00:00:00.000 --- -- 3 ---- ---- ------- 19770 ---- ------ 1.000
2008-03-02 00:00:00.000 --- -- 1 ---- ---- ------- 19770 ---- ------ 16.000
2008-03-02 00:00:00.000 --- -- 2 ---- ---- ------- 19770 ---- ------ 3.000
2008-03-02 00:00:00.000 --- -- 3 ---- ---- ------- 19770 ---- ------ 1.000
..........
..........
..........
..........
2008-11-02 00:00:00.000 --- -- 4 ---- ---- ------- 19770 ---- ------ 2.000

Bueno a lo que voy es que si hay info dentro de la tabla VentasAcumXDia, entonces a lo mejor es un error de logica mia, tambien comprendo que estoy pidiendo la informacion de un dia, asi que no prentendo que los demas dias tengan informacion , sino que la informacion del dia que se pida se despliegue en el campo correcto y no lo haga siempre en el campo 2.

Mil disculpas por dar tanta lata, y gracias por su ayuda y consejos en verdad que si sirven porque aprende uno a ver un problema desde varios enfoques, espero no molestarles mucho y pueda con su ayuda solucionar este problema que me frie las neuronas.
Muchas gracias a todos de nueva cuenta por su tiempo y por la molestia que se toman.
Saludos

Última edición por DrakenRG; 13/02/2008 a las 10:47
  #19 (permalink)  
Antiguo 13/02/2008, 11:19
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Como Insertar info de una tabla en otra

Bueno, el resultado es correcto para lo que hay en la tabla. La única conclusión a la que llego es muy simple. En lugar de guardar una fecha directamente en el campo "Fecha", alguien ha tenido la genial idea de formatearla antes de insertarla. Es decir en lugar de insertar la fecha en formato ISO ("YYYYMMDD" o "YYYY-MM-DD") en caso de que sean literales fecha, las está formateando con algo como los formatos que publicaste "YYYY/DD/MM" o "MM/DD/YYYY". La eterna recomendación de usar el formato ISO responde a un motivo muy simple: Al momento de interpretar la cadena literal de fecha, dependiendo de la configuración del sistema, los demás formatos pueden ser interpretados de varias maneras. Con el único que al final tendrás la fecha correcta en cualquier sistema es con el formato ISO, en un sistema en inglés, francés, o español. Siempre. Al final puedes darle el formato que quieras al resultado, pero nunca lo hagas al insertar o actualizar valores datetime, ni al establecer valores en variables y mucho menos en la cláusula WHERE.
Dices que tus datos llegan al día 11 de febrero. Lo que yo veo es que tienes datos para los días 2 de 11 meses. Un día de inserción más seguramente funcionará. Pero cuando actualicen el día 13 seguramente ocurrirá un error en el proceso que está insertando los valores de la tabla VentasAcumXDia, porque se está intercambiando los valores del día y el mes.

Última edición por Beakdan; 13/02/2008 a las 11:32
  #20 (permalink)  
Antiguo 13/02/2008, 17:35
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Tiene mucha logica lo que me dices, y de verdad creo en que estas en lo correcto, solo tengo una duda, el error esta en el como manejo las fechas en el codigo solamente o tambien tiene que ver con el formato en el que se pusieron en las tablas manualmente?.
Beakdan agradezco mucho tu ayuda , la molestia y el tiempo que te tomas, cualquier cosa que has publicado tiene base y esta en toda la razon, gracias por eso.
Saludos.
  #21 (permalink)  
Antiguo 14/02/2008, 13:15
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Como Insertar info de una tabla en otra

Vamos por partes.
La representación interna de SQL Server es independiente de la representación visual de la fecha. Es decir un valor DATETIME usa 8 bytes: 4 para la fecha, cuatro para la hora y un SMALLDATETIME usa 4: 2 para la fecha y dos para la hora. El formato debe importar solamente al momento de mostrar el resultado de una consulta.
Por otra parte el error debe estar en la manera en que las usas en el código. Pero es muy fácil aclararlo.
Con cada sesión que abras al motor, se te asigna un idioma por defecto. Y este idioma determina la opción DATEFORMAT que se te asigna. Ahora bien este formato no determina como se va a mostrar la fecha, sino cómo deben interpretarse las cadenas que contengan un literal de fecha. Puesto que la opción DATEFORMAT puede cambiar entre servidores, e incluso en un mismo servidor puede ser distinta entre logins, hay que usar para las literales un formato que no dé lugar a ambiguedades. Dichos formatos son el ISO y el ISO8601.
Hagamos unas pruebas. En el sistema en que estoy el idioma es Inglés, y la opción DATEFORMAT es mdy. Puedes averiguar tu opción actual con
Código:
dbcc useroptions 
Probemos lo siguiente:
Código:
--Formatos inseguros
select cast('02/01/2008' as datetime) --MM/DD/YYY
select cast('2008/02/01' as datetime) --YYYY/MM/DD
select cast('2008.02.01' as datetime) --YYYY.MM.DD (ANSI)
select cast('2008-02-01' as datetime) --YYYY-MM-DD
--Formatos seguros
select cast('20080201' as datetime) --ISO
select cast('2008-02-01T00:00:00' as datetime) --ISO8601 
Puesto que meses y días en los formatos 'inseguros' coinciden en orden con la opcion DATEFORMAT (mdy), no ha ocurrido ningún problema.
Ahora, probemos que pasaría con una opción DATEFORMAT distinta. Por ejemplo la que habría si el idioma fuera el español:
Código:
set dateformat dmy
--Formatos inseguros
select cast('02/01/2008' as datetime) --MM/DD/YYY
select cast('2008/02/01' as datetime) --YYYY/MM/DD
select cast('2008.02.01' as datetime) --YYYY.MM.DD (ANSI)
select cast('2008-02-01' as datetime) --YYYY-MM-DD
--Formatos seguros
select cast('20080201' as datetime) --ISO
select cast('2008-02-01T00:00:00' as datetime) --ISO8601 
Los resultados hablan por si mismos. Como puedes ver, hay posibilidad de errores cuando en el código usamos asignaciones o comparaciones que pueden ser ambiguas. Mi código puede funcionar muy bien ahora en mi sistema en Inglés, pero ¿y si alguien replica este código a un sistema en francés o español?
Si vas a comparar o asignar a un campo fecha lo mejor evidentemente es hacerlo con una fecha. Pero si debes usar un literal, asegúrate de que esté en formato iso. Si este literal viniera por ejemplo de una aplicación que llama a un procedimiento y no hubiera posibilidad de corregirle el formato desde la aplicación, debes averiguar exactamente que representan cada una de las partes en el literal para que puedas convertirlo adecuadamente. En el último de los casos, usar set dateformat con el formato deseado.

Cuando hice las pruebas con los formatos, encontré con horror que anteriormente recomendé el formato 'YYYY-MM-DD' como seguro, cuando realmente no lo es. Sucede que sin pensarlo más lo escribí omitiendo la parte del tiempo. Mil disculpas.
  #22 (permalink)  
Antiguo 15/02/2008, 17:48
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Gracias Beakdan, tienes razon, el analizador de consultas que uso yo tambien tiene el idioma ingles predeterminado.
Vi el punto de los formatos inseguros y los formatos seguros, esas partes ya las entendi al 100.

Ahora lo que tengo curiosidad es como quedaria el codigo sin el uso de literales. bueno tengo que confesar que no tengo idea que es una literal , a mi me suena a que es una variable o algo asi, mas no estoy seguro. Pero si me interesaria como es que quedaria el codigo sin el uso de literales. Bueno agradecido de antemano por su atencion y molestias .

Saludos!
  #23 (permalink)  
Antiguo 18/02/2008, 08:24
 
Fecha de Ingreso: enero-2008
Mensajes: 23
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Como Insertar info de una tabla en otra

Buenos dias , en el caso de este problemita que me ha estado dando dolores de cabeza, este punto al cual he llegado gracias a su ayuda , es el mas confuso de todos, ya que el problema radica en el uso de las literales ( No se bien que es una literal, yo creo o me suena a que es algo asi como una variable) hacen que el manejo de las fechas sea inseguro y la intrepetacion de las mismas hacen que la consulta se comporte del modo que lo hace. Por eso acudo una vez mas para ver si podrian iluminarme un poco, en la forma de como quedaria el codigo sin el uso de las literales o como es que se haria un buen manejo de las fechas en el codigo para que este no fuera inseguro.

Agradezco su tiempo y las molestias que se toman
Saludos!
  #24 (permalink)  
Antiguo 18/02/2008, 14:38
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Como Insertar info de una tabla en otra

Creo que te he confundido.
Primero, literal se refiere a la manera de expresar con letras un concepto.
Ahora bien, cuando digo que al comparar o asignar es mejor usar una fecha que un literal me refiero a esto:
Código:
WHERE a.Fecha = b.Fecha  --Comparar dos tablas con campos datetime
WHERE Fecha = @Fecha    --Comparar un campo datetime con una variable datetime
Y no a errores comunes que se llega uno a encontrar como:
Código:
WHERE a.Fecha = CONVERT(CHAR(10), b.Fecha, 103)
¿Por qué es un error? Pues porque ya se tenía una fecha, lo lógico es que la comparación fuera directa. ¿Para que convertirlo a una literal insegura (dd/mm/yyyy)? Tal vez para omitir la hora y comparar sólo con las fechas. Pero en ese caso hay que usar el formato ISO:
Código:
WHERE a.Fecha = CONVERT(CHAR(8), b.Fecha, 112)
Como puedes ver, no siempre puedes evitar el uso de literales de fecha.

Ahora bien, sobre tu problema, ya te había hecho notar que todas las fechas almacenadas son del segundo día de los meses de enero a noviembre. El código de la consulta está bien, y los resultados son correctos para lo que tienes almacenado en la tabla.
Así que para que se muestren los datos en los días "correctos", debes corregir las fechas ya almacenadas.
Nunca me dijiste cómo guardan la información en VentasAcumXDia ¿que pasó al guardar lo del día 13? ¿Cómo es el código al guardar? Allí es donde deben estar manejando mal las fechas. Y alli es donde deben estar haciendo un uso inadecuado de los formatos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:14.