Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Bases de datos > MS SQL Server
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 27/11/2021
MAXIUM's Avatar
MAXIUM MAXIUM is offline
Miembro
 
Join Date: May 2005
Posts: 1,503
Poder: 23
MAXIUM Va camino a la fama
Insertar datos de un tabla en otra

Hola a todos,

Tengo una consulta SQL que no se como completar y no sé cual sea la mejor opción por lo que recurro a vuestra sapiencia.

Tengo la TABLA_A y en esta se van almacenando los siguientes datos.

TABLA_A

Code:
| ID | NOMBRE |TIPO|ESTADO|
|----|--------|----|------|
|  1 |CABINA1 |  A |ACTIVO|
|  2 |CABINA1 |  B |ACTIVO|
|  3 |CABINA1 |  B | LISTO|
|  4 |CABINA1 |  A |  OK  |
|  5 |CABINA2 |  A | LISTO|
|  6 |CABINA2 |  B |ACTIVO|
|  7 |CABINA2 |  A |  OK  |
|  8 |CABINA2 |  B | LISTO|
No importa el orden de almacenamiento de los datos, solo quiero obtener el ULTIMO estado de cada cabina, por lo que uso la siguiente consulta SQL

Código SQL [-]
SELECT * FROM TABLA_A
WHERE ID IN (SELECT MAX(ID) FROM TABLA_A GROUP BY NOMBRE, TIPO);

Y obtengo
Code:
| ID | NOMBRE |TIPO|ESTADO|
|----|--------|----|------|
|  3 |CABINA1 |  B | LISTO|
|  4 |CABINA1 |  A |  OK  |
|  7 |CABINA2 |  A |  OK  |
|  8 |CABINA2 |  B | LISTO|
Lo que quiero es insertar todo en una segunda tabla, pero del siguiente modo
TABLA_B

Code:
| ID |NOMBRE  |TIPO|ESTADO|TIPO|ESTADO|
|----|--------|----|------|----|------|
|  1 |CABINA1 |  B | LISTO|  A |  OK  |
|  2 |CABINA2 |  A |  OK  |  B | LISTO|
En la TABLA_B la clave primaria es NOMBRE

Solo se me ocurre usar algo así para actualizar o inserta en esta tabla. Pero no se como integrar todo de una sola vez
Código SQL [-]
IF EXISTS(SELECT * FROM TABLA_B WHERE NOMBRE = NOMBRE)
    UPDATE 
    SET ...
    WHERE NOMBRE = NOMBRE
ELSE
    INSERT INTO
    ....

El motor es SQL Server.
Reply With Quote
  #2  
Old 27/11/2021
mamcx's Avatar
mamcx mamcx is offline
Moderador
 
Join Date: Sep 2004
Location: Medellín - Colombia
Posts: 3,941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Lo que describes y lo que pides no cuadra. Como va a ser "1 |CABINA1" el ultimo registro?
__________________
El malabarista.
Reply With Quote
  #3  
Old 27/11/2021
MAXIUM's Avatar
MAXIUM MAXIUM is offline
Miembro
 
Join Date: May 2005
Posts: 1,503
Poder: 23
MAXIUM Va camino a la fama
Quote:
Originally Posted by mamcx View Post
Lo que describes y lo que pides no cuadra. Como va a ser "1 |CABINA1" el ultimo registro?
Bueno, el ID de la TABLA_B es independiente del ID de la TABLA_A por eso es 1

También debes fijaros en esta sentencia
Código SQL [-]
SELECT * FROM TABLA_A
WHERE ID IN (SELECT MAX(ID) FROM TABLA_A GROUP BY NOMBRE, TIPO);

Arroja esto
Code:
| ID | NOMBRE |TIPO|ESTADO|
|----|--------|----|------|
|  3 |CABINA1 |  B | LISTO|
|  4 |CABINA1 |  A |  OK  |
|  7 |CABINA2 |  A |  OK  |
|  8 |CABINA2 |  B | LISTO|
Por ende CABINA1 | B | LISTO es el último de los registros del tipo B de los CABINA1, lo mismo para el CABINA1 | A y resto de las cabinas

Considera una carga de datos de ejemplo como esta
Code:
| ID | NOMBRE |TIPO|ESTADO|
|----|--------|----|------|
|  1 |CABINA1 |  A |ACTIVO|
|  2 |CABINA1 |  B |ACTIVO|
|  3 |CABINA1 |  B | LISTO|
|  4 |CABINA1 |  A |  OK  |
|  5 |CABINA2 |  A | LISTO|
|  6 |CABINA2 |  B |ACTIVO|
|  7 |CABINA2 |  A |  OK  |
|  8 |CABINA2 |  B | LISTO|
Reply With Quote
  #4  
Old 29/11/2021
bucanero bucanero is offline
Miembro
 
Join Date: Nov 2013
Location: Almería, España
Posts: 208
Poder: 13
bucanero Va camino a la fama
hola a todos!!

Sin dar muchos mas detalles de la relación existente entre los datos nombre/tipo y suponiendo que el campo tipo solo pude tener dos valores distintos (A, B), una solución para obtener los datos que marcas en el ejemplo puede ser esta:

Código SQL [-]
SELECT d1.nombre,
       t1.id,
       t1.tipo,
       t1.estado,
       t2.id,
       t2.tipo,
       t2.estado
  FROM (                                                                    --
        -- agrupa por nombre los distintos id de estado
        SELECT NOMBRE, MIN(UID) AS m1, MAX(UID) AS m2
          FROM (                                                            --
                -- seleciona el ultimo id de cada grupo de nombre, estado
                SELECT NOMBRE, MAX(ID) AS UID
                  FROM TABLA_A
                GROUP BY NOMBRE, TIPO) d0
        GROUP BY nombre) d1
       LEFT JOIN tabla_a t1 ON t1.id = m1
       LEFT JOIN tabla_a t2 ON t2.id = m2

Si el campo TIPO puede variar entre mas de dos valores distintos, entonces esta solución ya no es correcta.


Este hilo esta en el foro de MS-SQL. Si realmente estas utilizando MSSQL como motor de BBDD puede utilizar también la opción PIVOT, que permite agrupar múltiples registros en varias columnas de un único registro
Reply With Quote
  #5  
Old 29/11/2021
Neftali [Germán.Estévez]'s Avatar
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Join Date: Jul 2004
Location: Barcelona - España
Posts: 19,449
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Unas preguntas...
¿Los tipos sólo pueden ser A y B?
En cuanto al resultado en la TABLE_B
Code:
| ID |NOMBRE  |TIPO|ESTADO|TIPO|ESTADO|
|----|--------|----|------|----|------|
|  1 |CABINA1 |  B | LISTO|  A |  OK  |
|  2 |CABINA2 |  A |  OK  |  B | LISTO|

No acabo de entender que las 2 columnas TIPO tengan los valores cambiados. Es decir, no sería más fácil rellenar inicialmente la TABLA_B con unos valores tal que así:
Code:
| ID |NOMBRE  |TIPO|ESTADO|TIPO|ESTADO|
|----|--------|----|------|----|------|
|  1 |CABINA1 |  A | NULL |  B | NULL |
|  2 |CABINA2 |  A | NULL |  B | NULL |

Y luego ir haciendo UPDATES, según CABINA y TIPO.

Tampoco se si los valores CABINA1 y CABINA2 son de ejemplo y puedes tener más... (CABINA3, CABINA4,...)

Al final, para estos casos con una lógica más completa, también puedes hacer una función o un SP, que vaya haciendo los pasos que describes.
La SELECT INICIAL, luego la agrupación, y luego el INSERT o UPDATE final con un CASE.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Last edited by Neftali [Germán.Estévez] : 29/11/2021 at 10:45.
Reply With Quote
  #6  
Old 29/11/2021
Casimiro Noteví's Avatar
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Join Date: Sep 2004
Location: En algún lugar.
Posts: 32,681
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
De primer momento no contesté porque no se entiende correctamente el problema ni lo que se quiere conseguir.
Reply With Quote
  #7  
Old 29/11/2021
mamcx's Avatar
mamcx mamcx is offline
Moderador
 
Join Date: Sep 2004
Location: Medellín - Colombia
Posts: 3,941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Quote:
Originally Posted by MAXIUM View Post
Bueno, el ID de la TABLA_B es independiente del ID de la TABLA_A por eso es 1
Esto en parte refleja el problema. Los datos no se pueden diferenciar y por ende es dificil deducir como van al final.

Te recomiendo que le agreges un sufijo a los datos que marcan las diferencias (ej: id_a, cabina1_b) donde sea el caso.

---

Por otro lado, lo mas probable es que estas tratando de meter un circulo en un cuadrado. Cual es la RAZON y el objetivo de lo que haces?
__________________
El malabarista.
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
insertar registro de otra tabla diferentes base de datos igamerpc Tablas planas 7 16/04/2020 11:11
Insertar datos de una Tabla a otra usando where... verito_83mdq SQL 5 15/03/2011 19:28
Dbgrid para insertar en una tabla pero cogiendo datos de otra tabla taru MySQL 1 27/07/2006 15:36
insertar datos en una tabla desde otra Giniromero SQL 5 17/06/2004 19:37
Como insertar datos de una tabla en otra tabla? Salomon Firebird e Interbase 1 28/08/2003 11:29


All times are GMT +2. The time now is 02:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi