none
Conectar a dos BD para ejecutar Select con UNION RRS feed

  • Pregunta

  • Que tal gente

    Quiera ver si me pueden ayudar a resolver un pequeño problemita que tengo, quiero hacer esta consulta

    SELECT xx.UNC_IDCATALOGO,CARLINE1 AS CARLINE, COUNT(*) AS VENTAS_TOTALES,ANO FROM (
    	SELECT UNC_IDCATALOGO,VTE_SERIE,UNC_DESCRIPCION AS CARLINE1, COUNT(*) AS VENTAS,UNC_MODELO AS ANO FROM ADE_VTAFI
    	INNER JOIN UNI_PEDIUNI ON VTE_SERIE=PEN_NUMSERIE AND VTE_REFERENCIA1=CONVERT(VARCHAR,PEN_IDPEDI,103)
    	INNER JOIN UNI_CATALOGO ON PEN_IDCATALOGO=UNC_IDCATALOGO AND PEN_MODELO=UNC_MODELO
    	WHERE CONVERT(DATETIME,VTE_FECHDOCTO,103) between 
    	CONVERT(datetime,'01/04/2017',103) and CONVERT(datetime,'30/04/2017',103) AND VTE_FORMAPAGO NOT IN ('VTACON','VTACON1')
    	AND UNC_IDCATALOGO = '1251' and unc_modelo=2017
    	GROUP BY UNC_DESCRIPCION,UNC_IDCATALOGO,UNC_MODELO,VTE_SERIE 
    UNION
    	SELECT Base_2.dbo.UNI_CATALOGO.UNC_IDCATALOGO,Base_2.dbo.ADE_VTAFI.VTE_SERIE,Base_2.dbo.UNI_CATALOGO.UNC_DESCRIPCION AS CARLINE1, COUNT(*) 
    	AS VENTAS,Base_2.dbo.UNI_CATALOGO.UNC_MODELO AS ANO FROM Base_2.dbo.ADE_VTAFI 
    	INNER JOIN Base_2.dbo.UNI_PEDIUNI ON Base_2.dbo.ADE_VTAFI.VTE_SERIE=Base_2.dbo.UNI_PEDIUNI.PEN_NUMSERIE 
    	AND Base_2.dbo.ADE_VTAFI.VTE_REFERENCIA1=CONVERT(VARCHAR,Base_2.dbo.UNI_PEDIUNI.PEN_IDPEDI,103)
    	INNER JOIN Base_2.dbo.UNI_CATALOGO ON Base_2.dbo.UNI_PEDIUNI.PEN_IDCATALOGO=Base_2.dbo.UNI_CATALOGO.UNC_IDCATALOGO 
    	AND Base_2.dbo.UNI_PEDIUNI.PEN_MODELO=Base_2.dbo.UNI_CATALOGO.UNC_MODELO
    	WHERE CONVERT(DATETIME, Base_2.dbo.ADE_VTAFI.VTE_FECHDOCTO,103) between 
    	CONVERT(datetime,'01/04/2017',103) and CONVERT(datetime,'30/04/2017',103) AND  
    	Base_2.dbo.ADE_VTAFI.VTE_FORMAPAGO NOT IN ('VTACON','VTACON1')
    	AND Base_2.dbo.UNI_CATALOGO.UNC_IDCATALOGO = '1251' and Base_2.dbo.UNI_CATALOGO.unc_modelo='2017'
    	GROUP BY Base_2.dbo.UNI_CATALOGO.UNC_DESCRIPCION,Base_2.dbo.UNI_CATALOGO.UNC_IDCATALOGO,
    	Base_2.dbo.UNI_CATALOGO.UNC_MODELO,Base_2.dbo.ADE_VTAFI.VTE_SERIE) as xx group by unc_idcatalogo,CARLINE1,ANO

    desde Excel con VBA, la consulta en SQL corre sin problemas y me muestra el resultado correctamente, el problema al quererlo ejecutar en excel, ya que la conexión la hace a una sola base de datos es decir la primera pero la segunda que es la que hace a la Base_2 no esta conectada y me manda un error de sintaxis cerca de '.'. 

    Este el es código que esta en excel Prc_Conexion hace la conexión a la BD y esta así.

    Public Sub Prc_Conexion()
    Conexion1.Open "Provider=SQLOLEDB; Server=10.1.1.8; Database=Base_1; Uid=sa; Pwd=contraseña;"
    End Sub

                         Prc_Conexion
                         With Record1
                         .Open "SELECT xx.UNC_IDCATALOGO,CARLINE1 AS CARLINE, SUM(VENTAS) AS VENTAS_TOTALES,ANO FROM (" _
       & " SELECT UNC_IDCATALOGO,VTE_SERIE,UNC_DESCRIPCION AS CARLINE1, COUNT(*) AS VENTAS,UNC_MODELO AS ANO FROM ADE_VTAFI" _
       & " INNER JOIN UNI_PEDIUNI ON VTE_SERIE=PEN_NUMSERIE AND VTE_REFERENCIA1=CONVERT(VARCHAR,PEN_IDPEDI,103)" _
       & " INNER JOIN UNI_CATALOGO ON PEN_IDCATALOGO=UNC_IDCATALOGO AND PEN_MODELO=UNC_MODELO" _
       & " WHERE CONVERT(DATETIME,VTE_FECHDOCTO,103) between" _
       & " CONVERT(datetime,'" & FechaI & "',103) and CONVERT(datetime,'" & FechaF & "',103) AND VTE_FORMAPAGO NOT IN ('VTACON','VTACON1')" _
       & " AND UNC_IDCATALOGO = '" & id_catalogo & "' and unc_modelo=2017" _
       & " GROUP BY UNC_DESCRIPCION,UNC_IDCATALOGO,UNC_MODELO,VTE_SERIE" _
    & "Union" _
        & "SELECT Base_2.dbo.UNI_CATALOGO.UNC_IDCATALOGO,Base_2.dbo.ADE_VTAFI.VTE_SERIE,Base_2.dbo.UNI_CATALOGO.UNC_DESCRIPCION AS CARLINE1, COUNT(*)" _
        & "AS VENTAS,Base_2.dbo.UNI_CATALOGO.UNC_MODELO AS ANO FROM Base_2.dbo.ADE_VTAFI" _
        & "INNER JOIN Base_2.dbo.UNI_PEDIUNI ON Base_2.dbo.ADE_VTAFI.VTE_SERIE=Base_2.dbo.UNI_PEDIUNI.PEN_NUMSERIE" _
        & "AND Base_2.dbo.ADE_VTAFI.VTE_REFERENCIA1=CONVERT(VARCHAR,Base_2.dbo.UNI_PEDIUNI.PEN_IDPEDI,103)" _
        & "INNER JOIN Base_2.dbo.UNI_CATALOGO ON Base_2.dbo.UNI_PEDIUNI.PEN_IDCATALOGO=Base_2.dbo.UNI_CATALOGO.UNC_IDCATALOGO" _
        & "AND Base_2.dbo.UNI_PEDIUNI.PEN_MODELO=Base_2.dbo.UNI_CATALOGO.UNC_MODELO" _
        & "WHERE CONVERT(DATETIME, Base_2.dbo.ADE_VTAFI.VTE_FECHDOCTO,103) between" _
        & "CONVERT(datetime,'" & FechaI & "',103) and CONVERT(datetime,'" & FechaF & "',103) AND" _
        & "Base_2.dbo.ADE_VTAFI.VTE_FORMAPAGO NOT IN ('VTACON','VTACON1')" _
        & "AND Base_2.dbo.UNI_CATALOGO.UNC_IDCATALOGO = '" & id_catalogo & "' and Base_2.dbo.UNI_CATALOGO.unc_modelo='2017'" _
        & "GROUP BY Base_2.dbo.UNI_CATALOGO.UNC_DESCRIPCION,Base_2.dbo.UNI_CATALOGO.UNC_IDCATALOGO," _
        & "Base_2.dbo.UNI_CATALOGO.UNC_MODELO,Base_2.dbo.ADE_VTAFI.VTE_SERIE) as xx group by unc_idcatalogo,CARLINE1,ANO", Conexion1, , , adCmdText
    Mi pregunta como puedo hacer para que excel se conecte a las dos bases utilizando la misma conexión, o alguna sugerencia de como podría ejecutar este query?

    Gracias


    Chinoafro

    martes, 18 de abril de 2017 2:11

Respuestas

  • ...Mi pregunta es como puedo hacer para que Excel se conecte a las dos bases utilizando la misma conexión, o alguna sugerencia de como podría ejecutar este query?

    ¿Ambas bases de datos se encuentran en una misma instancia? De ser así, implementa una vista con la unión de ambas consultas de selección:

    CREATE VIEW dbo.NombreVista
    AS
        SELECT Col1, Col2 FROM dbo.ADE_VTAFI
        UNION ALL
        SELECT Col1, Col2 FROM Base_2.dbo.ADE_VTAFI
    GO

    Desde la aplicación ejecutas la consulta de selección contra la vista:

    SELECT * FROM dbo.NombreVista;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 18 de abril de 2017 2:42

Todas las respuestas

  • ...Mi pregunta es como puedo hacer para que Excel se conecte a las dos bases utilizando la misma conexión, o alguna sugerencia de como podría ejecutar este query?

    ¿Ambas bases de datos se encuentran en una misma instancia? De ser así, implementa una vista con la unión de ambas consultas de selección:

    CREATE VIEW dbo.NombreVista
    AS
        SELECT Col1, Col2 FROM dbo.ADE_VTAFI
        UNION ALL
        SELECT Col1, Col2 FROM Base_2.dbo.ADE_VTAFI
    GO

    Desde la aplicación ejecutas la consulta de selección contra la vista:

    SELECT * FROM dbo.NombreVista;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 18 de abril de 2017 2:42
  • Buenas que tal Chinoafro, como te comenta Williams lo puedes hacer a traves de una vista si se encuentra las bases de datos en la misma instancia, si se encuentra en diferentes instancias deberias de hacer un Linked Server, aqui te dejo el Link para que lo puedas lograr:

    Crear un Servidor Vinculado

    Ahora si quieres ejecutar la consulta en excel, tienes que ir a Datos y hacer una conexion y luego configurar el query.

    Luego lo configuras como te muestro a continuacion y que se conecte a traves de un Query.

    Cualquier cosa nos comentas,

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    martes, 18 de abril de 2017 3:17