none
Query para Ultimos 30 dias ou ultimos 90 dias. RRS feed

  • Pergunta

  • Pesosal tenho a seguinte query que traz os artigos dos ultimos 30 dias.

     

    SELECT DISTINCT TOP(10) C.ContentID, CC.SiteID, C.PublishUp, C.Title, Hits  
    FROM content AS C INNER JOIN ContentClassification AS CC ON C.ContentID = CC.ContentID 
     WHERE CC.SiteID = 1 AND (C.Published = 1) AND (C.PublishUp BETWEEN CONVERT(DATETIME ,'06/22/2010',102) AND CONVERT(DATETIME ,'07/22/2010',102))
     AND (CC.ClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL WHERE (SiteID = 1) 
     AND (ParentClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL1 WHERE (SiteID = 1)
     AND (ParentClassificationID = 34))))) 
     ORDER BY C.Hits DESC, C.Title ASC
    
    Porém  precisaria de um if ou coisa parecida quando não tiver os 10 ultimos artigos em 30 dias ele pegasse os ultimos 90 dias alguém tem alguma idéia?
    quinta-feira, 22 de julho de 2010 19:08

Respostas

  • Moises

    dependendo como vc vai usar usar este script vc pode usar um if @@rowcount ou um if exists tbm

    ex @@rowcount

    SELECT DISTINCT TOP(10) C.ContentID, CC.SiteID, C.PublishUp, C.Title, Hits 
    FROM content AS C 
      INNER JOIN ContentClassification AS CC ON C.ContentID = CC.ContentID 
    WHERE CC.SiteID = 1 
    AND (C.Published = 1) 
    AND (C.PublishUp BETWEEN CONVERT(DATETIME ,'06/22/2010',102) AND CONVERT(DATETIME ,'07/22/2010',102))
    AND (CC.ClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL WHERE (SiteID = 1) 
    AND (ParentClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL1 WHERE (SiteID = 1)
    AND (ParentClassificationID = 34))))) 
    ORDER BY C.Hits DESC, C.Title ASC
    
    if @@ROWCOUNT=0
    begin
      SELECT DISTINCT TOP(10) C.ContentID, CC.SiteID, C.PublishUp, C.Title, Hits 
      FROM content AS C 
        INNER JOIN ContentClassification AS CC ON C.ContentID = CC.ContentID 
      WHERE CC.SiteID = 1 
      AND (C.Published = 1) 
      AND (C.PublishUp BETWEEN CONVERT(DATETIME ,'06/22/2010',102) AND CONVERT(DATETIME ,'09/22/2010',102))
      AND (CC.ClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL WHERE (SiteID = 1) 
      AND (ParentClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL1 WHERE (SiteID = 1)
      AND (ParentClassificationID = 34))))) 
      ORDER BY C.Hits DESC, C.Title ASC
    
    end
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    • Marcado como Resposta Fernanda Simões segunda-feira, 26 de julho de 2010 17:49
    quinta-feira, 22 de julho de 2010 19:28
    Moderador
  • Olá,

    De qualquer jeito você terá que "tocar" os registros da tabela para saber se há ou não registros nos últimos 30 dias (através de um COUNT(*), IF EXISTS, @@ROWCOUNT, ou algo do gênero).

    Já que o trabalho terá que ser feito de qualquer maneira, o que eu faria seria manter o TOP(10) do jeito que está, porém deixando o range com 90 dias (ao invés de 30 dias) e ordenaria o resultado por data decrescente. Desta forma tendo ou não tendo registros nos últimos 30 dias, ele sempre pegará apenas os 10 mais recentes.

    Um abraço,

    Raul Santos Neto


    http://raulsantosneto.wordpress.com
    • Marcado como Resposta Fernanda Simões segunda-feira, 26 de julho de 2010 17:49
    quinta-feira, 22 de julho de 2010 20:12

Todas as Respostas

  • Moises

    dependendo como vc vai usar usar este script vc pode usar um if @@rowcount ou um if exists tbm

    ex @@rowcount

    SELECT DISTINCT TOP(10) C.ContentID, CC.SiteID, C.PublishUp, C.Title, Hits 
    FROM content AS C 
      INNER JOIN ContentClassification AS CC ON C.ContentID = CC.ContentID 
    WHERE CC.SiteID = 1 
    AND (C.Published = 1) 
    AND (C.PublishUp BETWEEN CONVERT(DATETIME ,'06/22/2010',102) AND CONVERT(DATETIME ,'07/22/2010',102))
    AND (CC.ClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL WHERE (SiteID = 1) 
    AND (ParentClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL1 WHERE (SiteID = 1)
    AND (ParentClassificationID = 34))))) 
    ORDER BY C.Hits DESC, C.Title ASC
    
    if @@ROWCOUNT=0
    begin
      SELECT DISTINCT TOP(10) C.ContentID, CC.SiteID, C.PublishUp, C.Title, Hits 
      FROM content AS C 
        INNER JOIN ContentClassification AS CC ON C.ContentID = CC.ContentID 
      WHERE CC.SiteID = 1 
      AND (C.Published = 1) 
      AND (C.PublishUp BETWEEN CONVERT(DATETIME ,'06/22/2010',102) AND CONVERT(DATETIME ,'09/22/2010',102))
      AND (CC.ClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL WHERE (SiteID = 1) 
      AND (ParentClassificationID IN (SELECT ClassificationID FROM dbo.Classification AS CL1 WHERE (SiteID = 1)
      AND (ParentClassificationID = 34))))) 
      ORDER BY C.Hits DESC, C.Title ASC
    
    end
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    • Marcado como Resposta Fernanda Simões segunda-feira, 26 de julho de 2010 17:49
    quinta-feira, 22 de julho de 2010 19:28
    Moderador
  • Olá,

    De qualquer jeito você terá que "tocar" os registros da tabela para saber se há ou não registros nos últimos 30 dias (através de um COUNT(*), IF EXISTS, @@ROWCOUNT, ou algo do gênero).

    Já que o trabalho terá que ser feito de qualquer maneira, o que eu faria seria manter o TOP(10) do jeito que está, porém deixando o range com 90 dias (ao invés de 30 dias) e ordenaria o resultado por data decrescente. Desta forma tendo ou não tendo registros nos últimos 30 dias, ele sempre pegará apenas os 10 mais recentes.

    Um abraço,

    Raul Santos Neto


    http://raulsantosneto.wordpress.com
    • Marcado como Resposta Fernanda Simões segunda-feira, 26 de julho de 2010 17:49
    quinta-feira, 22 de julho de 2010 20:12