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

[SOLUCIONADO] Añadir campo a vista y unificar con otro

Estas en el tema de Añadir campo a vista y unificar con otro en el foro de SQL Server en Foros del Web. Buenos días a todos/as Tengo una duda a ver si me podeis iluminar. Tengo una consulta que saca unos datos. Lo que quiero hacer es, ...
  #1 (permalink)  
Antiguo 04/09/2014, 02:57
 
Fecha de Ingreso: mayo-2007
Mensajes: 35
Antigüedad: 17 años, 6 meses
Puntos: 0
Añadir campo a vista y unificar con otro

Buenos días a todos/as

Tengo una duda a ver si me podeis iluminar. Tengo una consulta que saca unos datos. Lo que quiero hacer es, a esa consulta, sacarle otro campo nuevo y concatenarlo con uno de la consulta original.

La consulta es la siguiente:

Código SQL:
Ver original
  1. SELECT        TOP (100) PERCENT C.IdCliente AS [ID Cliente], COALESCE (G.Grupo, 'NINGUNO') AS [Grupo], C.Nombre AS Cliente,
  2.                          CASE WHEN G.PorcentajeParticipacion IS NOT NULL THEN dbo.Money2Varchar(G.PorcentajeParticipacion, 2, '%') ELSE '' END AS Participación
  3. FROM            (SELECT DISTINCT IdCliente
  4.                           FROM            dbo.Operaciones) AS O INNER JOIN
  5.                          dbo.Clientes AS C LEFT OUTER JOIN
  6.                              (SELECT        G1.IDCliente, C1.ClaveDescr AS Grupo, G1.PorcentajeParticipacion
  7.                                FROM            dbo.GruInvClientes AS G1 INNER JOIN
  8.                                                          dbo.Claves AS C1 ON G1.GruInv = C1.CodClave
  9.                                WHERE        (C1.GrupoClave = 'GRI') AND (C1.Cabecera = 1) AND (C1.Modificable = 1)) AS G ON C.IdCliente = G.IDCliente ON O.IdCliente = C.IdCliente
  10. WHERE        (C.IDCartera = 2)
  11.  
  12. ORDER BY [Grupo]

Hasta aqui correcto. Ahora lo que quiero es sacar el campo importe de la tabla Operaciones y concatenarlo con el porcentaje de participacion, de forma que quede algo así como:

ID Cliente Cliente Grupo Nominal (saco importe de la tabla operaciones y lo concateno con el PorcentajeParticipacion)

1 CL1 G1 400 - 20%

He intentado con una UNION, pero claro, me saca error porque no coinciden el número de campos. Si añado el campo en el select del primer FROM, no me hace caso ( no saca el campo)

Alguna idea de cómo enfocarlo??

Desde ya, gracias por adelantado.

Saludos!

Última edición por gnzsoloyo; 04/09/2014 a las 09:26
  #2 (permalink)  
Antiguo 04/09/2014, 08:14
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Añadir campo a vista y unificar con otro

ya trataste con otro subquery y con un join????
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 04/09/2014, 09:59
 
Fecha de Ingreso: mayo-2007
Mensajes: 35
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Añadir campo a vista y unificar con otro

Hola Libras. Gracias por la respuesta!

Al final conseguí sacar el campo. El caso es que la estoy sacando con más campos y ahora me falla en un DateDiff entre la fecha actual y un campo fecha de mi BBDD.

La consulta es:

SELECT TOP (100) PERCENT O.IdOp AS [ID Operacion], COALESCE (G.Grupo, C.Nombre) AS [Grupo Inversor],
CASE WHEN G.PorcentajeParticipacion IS NOT NULL THEN dbo.Money2Varchar(G.PorcentajeParticipacion, 2, '%')
ELSE '' END AS Participación,
CASE WHEN G.PorcentajeParticipacion > 0 then (o.impop * G.PorcentajeParticipacion) /(100)
ElSE o.impop end as Nominal,
CASE WHEN (DATEDIFF(d, CONVERT(date, GETDATE(), 103), o.FchPrimerVto) < 30) THEN '1M'
WHEN (DATEDIFF(d, CONVERT(date, GETDATE(), 103), o.FchPrimerVto) < 90) THEN '3M'
ELSE '6M'end AS Plazo

FROM (SELECT DISTINCT IdOp, idCliente, sum(ImpOp) as impop, FchPrimerVto
FROM dbo.Operaciones group by IdOp, idCliente, FchPrimerVto ) AS O INNER JOIN
dbo.Clientes AS C LEFT OUTER JOIN
(SELECT G1.IDCliente, C1.ClaveDescr AS Grupo, G1.PorcentajeParticipacion
FROM dbo.GruposInversoresClientes AS G1 INNER JOIN
dbo.Claves AS C1 ON G1.GrupoInversor = C1.CodClave
WHERE (C1.GrupoClave = 'GRI') AND (C1.Cabecera = 1) AND (C1.Modificable = 1)) AS G
ON C.IdCliente = G.IDCliente ON O.IdCliente = C.IdCliente

WHERE (C.IDCartera = 2)

ORDER BY [Grupo Inversor]

El fallo que me lanza es "Arithmetic overflow error converting expression to data type datetime." en lo que te pongo en rojo.

Si a mi campo le pongo Convert(date,o.FchPrimerVto)) en esa linea marcada, me dice "Explicit conversion from data type int to date is not allowed."

Y si directamente le pongo una fecha con formato 'yyyyMMdd', no falla la consulta, pero el CASE no funciona bien y ponga la fecha que ponga, me saca 1M

Si tienes cualquier sugerencia, será bienvenida.
  #4 (permalink)  
Antiguo 04/09/2014, 10:02
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: Añadir campo a vista y unificar con otro

¿Nos puedes mostrar que trae FchPrimerVto?
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 04/09/2014, 10:12
 
Fecha de Ingreso: mayo-2007
Mensajes: 35
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Añadir campo a vista y unificar con otro

Claro!

Si hago

select FchPrimerVto from operaciones

me trae:

20150830
20150802
20150730
20150730
20150710
20150710

(. . . )
  #6 (permalink)  
Antiguo 04/09/2014, 10:15
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Añadir campo a vista y unificar con otro

el datediff para los dias es dd que no????
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 04/09/2014, 10:20
 
Fecha de Ingreso: mayo-2007
Mensajes: 35
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Añadir campo a vista y unificar con otro

Gracias por responder Libras

Si pongo:

(. . .)
CASE WHEN (DATEDIFF(dd, CONVERT(date, GETDATE(), 103), o.FchPrimerVto) < 30) THEN '1M'
WHEN (DATEDIFF(dd, CONVERT(date, GETDATE(), 103), o.FchPrimerVto) < 90) THEN '3M'
ELSE '6M'end AS Plazo
(. . .)

Me sigue saliendo: "Arithmetic overflow error converting expression to data type datetime."
  #8 (permalink)  
Antiguo 04/09/2014, 10:40
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Añadir campo a vista y unificar con otro

vamos por partes, esto que te regresa

Código SQL:
Ver original
  1. DATEDIFF(dd, CONVERT(DATE, GETDATE(), 103), o.FchPrimerVto)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 04/09/2014, 13:46
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: Añadir campo a vista y unificar con otro

Ya hice la prueba y funciona bien

select CASE WHEN( DATEDIFF(dd, CONVERT(date, GETDATE(), 103), '20150830') > 30) THEN '1M' END
__________________
MCTS Isaias Islas
  #10 (permalink)  
Antiguo 05/09/2014, 00:17
 
Fecha de Ingreso: mayo-2007
Mensajes: 35
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Añadir campo a vista y unificar con otro

Hola Libras!

Gracias por la respuesta.

Cita:
Iniciado por Libras Ver Mensaje
vamos por partes, esto que te regresa

Código SQL:
Ver original
  1. DATEDIFF(dd, CONVERT(DATE, GETDATE(), 103), o.FchPrimerVto)
Esto me da el error "Arithmetic overflow error converting expression to data type datetime."
  #11 (permalink)  
Antiguo 05/09/2014, 00:21
 
Fecha de Ingreso: mayo-2007
Mensajes: 35
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Añadir campo a vista y unificar con otro

Cita:
Iniciado por iislas Ver Mensaje
Ya hice la prueba y funciona bien

select CASE WHEN( DATEDIFF(dd, CONVERT(date, GETDATE(), 103), '20150830') > 30) THEN '1M' END
Hola iislas.

Gracias por la respuesta. Si, eso funciona bien cuando le pones la fecha tal cual en la consulta, pero no cuando tomo la fecha de mi campo de Base de Datos.

Sigo con ello a ver si lo saco. Cualquier sugerencia, será bienvenida.


P.D: En la Base de Datos, el campo FchPrimerVto es de tipo T_Fecha:int (no había visto nunca este tipo de dato. Debe ser nuevo en SQL Server 2012) por si os sirve de pista.

Saludos a ambos y gracias por las molestias que os estais tomando.

Última edición por CrepuX; 05/09/2014 a las 01:00
  #12 (permalink)  
Antiguo 05/09/2014, 02:19
 
Fecha de Ingreso: mayo-2007
Mensajes: 35
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Añadir campo a vista y unificar con otro

Lo conseguí!!!!

Haciendo prueba y error, el código correcto sería:

CASE WHEN (DATEDIFF(day, GETDATE(), convert(datetime, convert(char, o.FchPrimerVto))) < 30) THEN '1M'
WHEN (DATEDIFF(day, GETDATE(), convert(datetime, convert(char, o.FchPrimerVto))) < 90) THEN '3M'
ELSE '6M'end AS Plazo

Con esto, en principio, ya te lo hace bien.

Muchas gracias chicos por ocupar parte de vuestro tiempo ayudandome.

Saludos!

Etiquetas: campo, select, siguiente, tabla, vista
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 16:20.