none
três consultas funcionando, como colocar em uma só. RRS feed

  • Pergunta

  • Não consegui montar uma consulta com o Inner Join, tive que mantar 3 connection, preciso colocar essas 3 em uma só consulta.

    Se meu chefe, pega isso... ele me manda embora!  rsrssrs

     

    <%
     if request.form("txtdata") <> "" and request.Form("txtdata2") <> "" then
     dia = request.form("txtdata")
     dia = DataToSQLServer(Request("txtdata"))
     dia2 = request.form("txtdata2")
     dia2 = DataToSQLServer(Request("txtdata2"))
     Dim DB, cSql, objRS
       Set DB = Server.CreateObject("ADODB.Connection")
       DB.Open(StrConn)
      cSql = "SELECT sum(Impressoes) AS Soma FROM Newsletter WHERE Data between '"&dia&"' and '"&dia2&"'"  
         Set objRS = Server.CreateObject("ADODB.Recordset")
         Set objRs = DB.Execute(cSql)   
         soma = objRS("Soma")
      objRS.Close 
        Set objRS = Nothing 
        DB.Close 
        Set DB = Nothing   
    end if 
     %> 
     <%
      if request.form("txtdata") <> "" and request.Form("txtdata2") <> "" then
     dia = request.form("txtdata")
     dia = DataToSQLServer(Request("txtdata"))
     dia2 = request.form("txtdata2")
     dia2 = DataToSQLServer(Request("txtdata2"))
     Dim DB2, cSql2, objRS2
       Set DB2 = Server.CreateObject("ADODB.Connection")
       DB2.Open(StrConn)
      cSql2 = " SELECT  CodigoOrigemUsuario, SUM(Valor) AS Soma2 FROM Pagamentos " &_
      " WHERE CodigoOrigemUsuario = '11' and  Data_ between '"&dia&"' and '"&dia2&"'   Group by CodigoOrigemUsuario "  
         Set objRS2 = Server.CreateObject("ADODB.Recordset")
         Set objRS2 = DB2.Execute(cSql2)  
         soma2 = objRS2("Soma2")
      objRS2.Close 
        Set objRS2 = Nothing 
        DB2.Close 
        Set DB2 = Nothing   
    end if 
     %> 
     <%
     if request.form("txtdata") <> "" and request.Form("txtdata2") <> "" then
     dia = request.form("txtdata")
     dia = DataToSQLServer(Request("txtdata"))
     dia2 = request.form("txtdata2")
     dia2 = DataToSQLServer(Request("txtdata2"))
       Set DB3 = Server.CreateObject("ADODB.Connection")
       DB3.Open(StrConn)

      cSql3 = " SELECT Count(CodigoOrigemUsuario) AS Soma3 FROM Clicks " &_
      " WHERE CodigoOrigemUsuario = '11' and  Data_ between '"&dia&"' and '"&dia2&"' Group by  CodigoOrigemUsuario "  
         Set objRS3 = Server.CreateObject("ADODB.Recordset")
         Set objRS3 = DB3.Execute(cSql3)  
        soma3 = objRS3("Soma3")
       objRS3.Close 
         Set objRS3 = Nothing 
         DB3.Close 
         Set DB3 = Nothing  
    end if 
     %>

     

    Essas 3 consultas me trazem os seguintes valores:  " Impressoes - Clicks - Total de pagamentos "

    Tem como dar uma forcinha ?

    terça-feira, 11 de março de 2008 14:42

Todas as Respostas

  • Bom Dia,

     

    Qual é a relação entre Newsletter, Pagamentos e Clicks ?

     

    Se a idéia é apenas juntar os ResultSets, utilize o operador UNION ou UNION ALL. Ex:

     

    Code Snippet

    SELECT <Campos> FROM Tab1

    UNION ALL

    SELECT <Campos> FROM Tab2

    UNION ALL

    SELECT <Campos> FROM Tab3

     

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 11 de março de 2008 14:55
  • Obrigado..

     

    na tabela Newsletter eu somo a qtd de impressoes referente a data digita, na Tabela Pagamentos vejo se tem o código news, se tiver faço a soma do campo valor, Na Tabela Clicks vejo se tem o código da news, se tiver eu somo eles entre essas datas;

    terça-feira, 11 de março de 2008 15:20
  • cara, tenta essa query aqui, eu fiz algo parecido no oracle e no sql server...não sei se vai estar certo...mas ve se te ajuda.

    SELECT sum(N.Impressoes) AS Soma,P.CodigoOrigemUsuario, SUM(P.Valor) AS Soma2,Count(C.CodigoOrigemUsuario) AS Soma3
    FROM Newsletter N, Pagamentos P,Clicks C
    WHERE N.Data between '"&dia&"' and '"&dia2&"'
    and P.CodigoOrigemUsuario = '11'
    and  P.Data_ between '"&dia&"'
    and '"&dia2&"'
    and C.CodigoOrigemUsuario = '11'
    and  C.Data_ between '"&dia&"'
    and '"&dia2&"'  
    terça-feira, 11 de março de 2008 15:38
  • Acho que pode dar certo sim... mas deu esse erro !

     

    Microsoft OLE DB Provider for SQL Server (0x80040E14)
    Column 'Pagamentos.CodigoOrigemUsuario' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    Ficou assim o código:

     

    cSql = " SELECT sum(N.Impressoes) AS Soma,P.CodigoOrigemUsuario, SUM(P.Valor) AS Soma2,Count(C.CodigoOrigemUsuario) AS Soma3 " &_
     " FROM Newsletter N, Pagamentos P,Clicks C " &_
     " WHERE N.Data between '"&dia&"' and '"&dia2&"' " &_
     " and P.CodigoOrigemUsuario = '11' " &_ 
     " and  P.Data_ between '"&dia&"' " &_
     " and '"&dia2&"' " &_
     " and C.CodigoOrigemUsuario = '11' " &_
     " and  C.Data_ between '"&dia&"' " &_
     " and '"&dia2&"' "
     Set objRS = Server.CreateObject("ADODB.Recordset") 
     Set objRS = DB.Execute(cSql)   
     soma = objRS("Soma")
     soma2 = objRS("Soma2")
     soma3 = objRS("Soma3")

    terça-feira, 11 de março de 2008 16:23
  • Junior,

     

    Quando se utiliza no select funções de agregação de valores é  necessário utilizar a claúsula Group BY especificando todos os campos declarados no select mas que não estão utilizando funções de agregação.

     

    Veja abaixo o código de exemplo:

     

     

    Code Snippet

    SELECT sum(N.Impressoes) AS Soma,P.CodigoOrigemUsuario, SUM(P.Valor) AS Soma2,Count(C.CodigoOrigemUsuario) AS Soma3
    FROM Newsletter N, Pagamentos P,Clicks C
    WHERE N.Data between '"&dia&"' and '"&dia2&"'
    and P.CodigoOrigemUsuario = '11'
    and  P.Data_ between '"&dia&"'
    and '"&dia2&"'
    and C.CodigoOrigemUsuario = '11'
    and  C.Data_ between '"&dia&"'
    and '"&dia2&"'  

    Group By P.CodigoOrigemUsuaro

     

     

     

    terça-feira, 11 de março de 2008 16:30
  • Demorou bastante o carrregamento e deu esse erro :

     

    Tipo de erro:
    Microsoft OLE DB Provider for SQL Server (0x80040E31)
    Tempo excedido

    o que é ?

     

    terça-feira, 11 de março de 2008 16:36
  • Olá Junior (o INC),

     

    A resposta é muito simples e está relacionada à pergunta que fiz (Qual é a relação entre as tabelas ?)

     

    Enquanto não soubermos o relacionamento entre as tabelas, não poderemos elaborar o SELECT correto. O que une a tabela de News com a de pagamentos e a da Click ? Deve ter alguma PK e FK envolvidas nessas tabelas. A menos que tenhamos essa informação não poderemos elaborar o SELECT correto (mesmo olhando suas consultas).

     

    Os SELECTs postados estão produzindo produtos cartesianos e a quantidade de registros deve ser tão grande que o SQL Server dá TimeOut (ainda que você não venha a utilizar nem 1% deles)

     

    [ ]s,

     

    Gustavo

    terça-feira, 11 de março de 2008 17:26
  • Fui verificar lá.

     

    Na Tabela Pagamentos " CodigoOrigemUsuario = null"

    Na Tabela Newsletter " Impressoes = null "

    Na Tabela Clicks     " CodigoOrigemUsuario = null"


    Todos os campos que estamos consultando tem o valor " null "

     

     

    Somente na Tabela Pagamento tem PK e FK

    - CodigoPagamento = PK

    - CodigoUsuario      = FK

    terça-feira, 11 de março de 2008 17:35
  • Olá Júnior (o INC),

     

    Acho que você não me entendeu (ou será que eu não o entendi ?)

     

    Existe uma tabela de Newsletter, uma de pagamentos e uma de Clicks ? Não há nenhum campo que faça um relacionamento entre elas ? Se eu tenho por exemplo uma tabela de clientes e uma tabela de pedidos, na tabela de clientes o campo codigoCliente é chave primária enquanto que na tabela de Pedidos é chave estrangeira. É justamente o campo codigoCliente que identifica o cliente que fez o pedido.

     

    Estou vendo três tabelas e ainda não sei qual é o relacionamento entres elas. Sem saber qual é o relacionamento não há como projetar o código SQL adequado.

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 11 de março de 2008 17:58