separar campos de la tabla

17/06/2004 - 14:02 por Jomaweb | Informe spam
Hola

tengo la siguiente tabla:

CLIENTE PEDIDO1 FACTURA1 PEDIDO2 FACTURA2 PEDIDO3
FACTURA3

y quiero pasar sus datos a esta otra:

CLIENTE PEDIDO FACTURA NUMERO

El campo NUMERO es el que me permitirá determinar si es la factura 1 , la 2
o la 3. En principio iba así porque no era posible que un cliente tuviera
más de tres facturas a la misma vez. Pueden existir clientes con solo un
pedido, con dos o con tres. Mínimo siempre uno.

Lo intento con un procedimiento almacenado (que adjunto al final del texto)
pero solamente me pasa el primer cliente.
Me han dicho que visualmente es más facil hacerlo con las herramientas del
administrador corporativo como por ejemplo el asistente de paquetes de
transformación de datos o que si no tengo que hacer un lio con cursores
FETCH.
¿Sigo con el Procedimiento almacenado (que os ruego reviséis), me meto con
FETCH, o es más facil con los asistentes?

Gracias
____________________________________________________________________________
________________

CREATE PROCEDURE [pa_clientes_nuevaTabla] AS
DECLARE @cliente integer,@pedido1 integer, @factura1 integer, @pedido2
integer, @factura2 integer, @pedido3 integer, @factura3 integer

select @cliente=cliente,@pedido1=pedido1,
@factura1=factura1,@pedido2=pedido2, @factura2=factura2,@pedido3=pedido3,
@factura3=factura3 from TABLACLIENTES

IF (@factura1<>0) insert into NUEVATABLA
(cliente,pedido,factura,numero) values(@cliente,@pedido,@factura,'1')
IF (@factura2<>0) insert into NUEVATABLA
(cliente,pedido,factura,numero) values(@cliente,@pedido,@factura,'2')
IF (@factura3<>0) insert into NUEVATABLA (cliente,pedido,factura,numero)
values(@cliente,@pedido,@factura,'3')


GO

Preguntas similare

Leer las respuestas

#11 Fernando España
18/06/2004 - 23:44 | Informe spam
jejejejejejejeje, Hombre, faltaba mas, acaso estamos peleando.. jamas. Yo
tambien voy en contra de los cursores, definitivamente y como bien lo dices
tu y no es meterme a relajos, a nadie, digo, nadie, exepto el que lo hizo se
le ocurriria una tabla con semejante estructura, pero nimodos cada cabeza es
un mundo y cada quien hace de sus sistmas lo que quiere, sinembargo como
tambien lo repito, es una solucion practica y sencilla aunque quiza no del
todo "decente". asi que...
VIVE BIEN Y MUERE FELIZ.. jajaja, y para nada Javier pura vida mae...!!. (se
que es broma)..



Fernando España
Gerente Informatica
Alta Tecnologia en Informatica S.A.
www.atisa.com.gt
7a. calle 4-34 Zona 10
Guatemala Centro America
PBX: (502) 3620005

Email:

****************************************

"Javier Loria" escribió en el mensaje
news:%
Hola Jomaweb:
Hola mi unica intencion era molestar a mi amigo Fernando, no era una
posicion seria solo "fregar". Si quieres mi respuesta seria con mucho


gusto.
:D
No, no creo que haya que usar cursores para manejar la parte de SQL


del
DML (Data Modification Language). Es un pesimo sintoma tener que recurrir


a
ellos para solucionar problemas. Lo que te dijo Lilliana medio en broma
("son contra mi religion...") demuestra la fuerza mental que tiene ella


para
no recurrir a este tipo de solucion obligandose a pensar unicamente en
conjuntos de datos y no de forma procedimental. Con esto logra desarrollar
soluciones que no requieren cursores y que son mas rapidas, mas faciles de
mantener, y entrena a su mente en este tipo de codigo.
Fernando <Broma>de ahora en adelante llamado Marcus Brutus</Broma> le
dio una solucion de cursor con lo cual te privo de esta experiencia. Yo no
queria participar en este hilo porque me parecia que lo manejaban
perfectamente pero ahora me obliga a participar.
La tabla TablaClientes rompe la primera forma Normal (1NF) que exige
que las tablas no tengan grupos repetidos y que cada columna sea
escalar/atomica y no un arrego o lista de algo. Si la normalizamos con la
siguiente vista:
=> CREATE VIEW ClientesNormalizado
AS
SELECT Cliente
, Pedido1 AS Pedido
, Factura1 AS Factura
, 1 AS Orden
FROM TablaClientes
WHERE Factura1<>0
UNION ALL
SELECT Cliente, Pedido2, Factura2, 2
FROM TablaClientes
WHERE Factura2<>0
UNION ALL
SELECT Cliente, Pedido3, Factura3, 3
FROM TablaClientes
WHERE Factura3<>0
=> Podemos utilzarlo como base. (Seria mejor hacerlo fisicamete)
Ahora para poder construir el INSERT (sin Identity),
=> SELECT C1.Cliente
, C1.Pedido
, C1.Factura
, C1.Orden
, COUNT(*) AS SustitodeIdentity
FROM ClientesNormalizado AS C1
JOIN ClientesNormalizado AS C2
ON C1.Cliente>C2.Cliente
OR (C1.Cliente= C2.Cliente AND C1.Orden>Â.Orden)
GROUP BY C1.Cliente, C1.Pedido, C1.Factura, C1.Orden
=> 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.



Jomaweb escribio:
> Hombre, yo no digo que se usen los cursores para todo, pero me parece
> que cuando a uno le sirven para algo hay que usarlos.
> Saludos y gracias
>
> "Javier Loria" escribió en el mensaje
> news:ej%
>> Hola Fernando:
>> No me quedas mas que decirte:
>> > >> ET TU, BRUTE?
>> Julio Cesar, Acto III.
>> ==> >> 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.
>>
>>
>> Fernando España escribio:
>>> declare @cliente char(x)
>>>
>>> declare lista_clientes cursor for
>>> select distinct cliente from
>>> vieja order by cliente
>>>
>>> open lista_clientes
>>>
>>> fetch lista_clientes into @cliente
>>>
>>> while @@fetch_status=0
>>> Begin
>>> insert nueva
>>> select cliente,pedido1 from vieja
>>> where cliente=@cliente
>>> insert nueva
>>> select cliente,pedido2 from vieja
>>> where cliente=@cliente
>>> insert nueva
>>> select cliente,pedido2 from vieja
>>> where cliente=@cliente
>>>
>>> .. hasta terminar campos.
>>>
>>> fetch lista_clientes into @cliente
>>> End
>>> close lista_clientes
>>> deallocate lista_clientes
>>>
>>>
>>>
>>>
>>> "joselitux" escribió en el mensaje
>>> news:
>>>> No puedo usar insert into porque el orden es importante.
>>>> Es decir, que debo insertar factura 1, dos y tres correlativamente
>>>> para que tengan in identity lo más próximo posible.
>>>>
>>>> On Thu, 17 Jun 2004
>>>> 13:12:31 -0300, Guido wrote:
>>>>
>>>>> Algo asi:
>>>>> INSERT INTO Nueva
>>>>> SELECT CLIENTE, PEDIDO1, FACTURA1, 1 AS NUMERO
>>>>> FROM VIEJA
>>>>>
>>>>> despues cambias los unos por doses y treses y la ejecutas de
>>>>> nuevo.
>>>>>
>>>>> Guido
>>>>> Insetec
>>>>> La Plata Argentina
>>>>>
>>>>> "Maxi" escribió en el mensaje
>>>>> news:%
>>>>>> Hola, y porque no usar Insert into?
>>>>>>
>>>>>> o sea:
>>>>>>
>>>>>> Insert into tabladestino (campos)
>>>>>> Select campos from tablaorigen
>>>>>>
>>>>>> Asi deberias hacerlo
>>>>>>
>>>>>>
>>>>>> Salu2
>>>>>> Maxi
>>>>>> Buenos Aires - Argentina
>>>>>> Desarrollador Microsoft 3 Estrellas .NET
>>>>>> Nunca consideres el estudio como una obligación sino como
>>>>>> una oportunidad para penetrar en el bello y maravillosos
>>>>>> mundo del saber.
>>>>>> - Albert Einstein
>>>>>>
>>>>>>
>>>>>>
>>>>>> "Jomaweb" escribió en el mensaje
>>>>>> news:uop$
>>>>>>> Hola
>>>>>>>
>>>>>>> tengo la siguiente tabla:
>>>>>>>
>>>>>>> CLIENTE PEDIDO1 FACTURA1 PEDIDO2 FACTURA2
>>>>>>> PEDIDO3 FACTURA3
>>>>>>>
>>>>>>> y quiero pasar sus datos a esta otra:
>>>>>>>
>>>>>>> CLIENTE PEDIDO FACTURA NUMERO
>>>>>>>
>>>>>>> El campo NUMERO es el que me permitirá determinar si es la
>>>>>>> factura 1
>>> ,
>>>>> la
>>>>>> 2
>>>>>>> o la 3. En principio iba así porque no era posible que un
>>>>>>> cliente tuviera más de tres facturas a la misma vez. Pueden
>>>>>>> existir clientes con solo un pedido, con dos o con tres. Mínimo
>>>>>>> siempre uno.
>>>>>>>
>>>>>>> Lo intento con un procedimiento almacenado (que adjunto al final
>>>>>>> del texto) pero solamente me pasa el primer cliente.
>>>>>>> Me han dicho que visualmente es más facil hacerlo con las
>>>>>>> herramientas del administrador corporativo como por ejemplo el
>>>>>>> asistente de paquetes de transformación de datos o que si no
>>>>>>> tengo que hacer un lio con cursores FETCH.
>>>>>>> ¿Sigo con el Procedimiento almacenado (que os ruego reviséis),
>>>>>>> me meto con FETCH, o es más facil con los asistentes?
>>>>>>>
>>>>>>> Gracias
>>>>>>>
>>>>>>
>>>>>
>>>
>>
>



____________________________________________________________________________
>>>>>>> ________________
>>>>>>>
>>>>>>> CREATE PROCEDURE [pa_clientes_nuevaTabla] AS
>>>>>>> DECLARE @cliente integer,@pedido1 integer, @factura1 integer,
>>>>>>> @pedido2 integer, @factura2 integer, @pedido3 integer, @factura3
>>>>>>> integer
>>>>>>>
>>>>>>> select @cliente=cliente,@pedido1=pedido1,
>>>>>>> @factura1=factura1,@pedido2=pedido2,
>>>>>>> @factura2=factura2,@pedido3=pedido3, @factura3=factura3 from
>>>>>>> TABLACLIENTES
>>>>>>>
>>>>>>> IF (@factura1<>0) insert into NUEVATABLA
>>>>>>> (cliente,pedido,factura,numero)
>>>>>>> values(@cliente,@pedido,@factura,'1') IF (@factura2<>0)
>>>>>>> insert into NUEVATABLA (cliente,pedido,factura,numero)
>>>>>>> values(@cliente,@pedido,@factura,'2') IF (@factura3<>0)
>>>>>>> insert into NUEVATABLA (cliente,pedido,factura,numero)
>>>>>>> values(@cliente,@pedido,@factura,'3')
>>>>>>>
>>>>>>>
>>>>>>> GO
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Outgoing mail is certified Virus Free.
>>>>>> Checked by AVG anti-virus system (http://www.grisoft.com).
>>>>>> Version: 6.0.698 / Virus Database: 455 - Release Date: 02/06/2004


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