0
votes

Requête renvoyant la même ligne plusieurs fois

Ma requête renvoie un résultat plusieurs fois. Je sais que la réponse doit être simple, mais je suis exclu. Toute aide est appréciée.

Mon code est ci-dessous. P>

USE ODS

DECLARE @recalctime AS TIME
DECLARE @portfolio AS VARCHAR(MAX)
DECLARE @loannumber AS BIGINT
DECLARE @zipcode AS VARCHAR(10)
DECLARE @timezone AS VARCHAR(10)
DECLARE @calltime AS TIME
DECLARE @cst AS DATETIME
DECLARE @calldate AS DATETIME

SELECT
@portfolio = CASE
    WHEN r.PortfolioID = '10' THEN 'A'
    WHEN r.portfolioid = '11' THEN 'B'
    WHEN r.PortfolioID = '12' THEN 'C'
    ELSE CAST(r.portfolioid AS VARCHAR)
    END 
, @calldate = CAST(r.RowCreatedDate AS DATE) 
, @loannumber = r.loannumber 
, @zipcode = r.zipcode 
, @timezone = r.zone 
, @calltime = CONVERT(char(10), r.contacttime, 108) 
, @recalctime = CASE
    WHEN r.Zone = 'PST' THEN DATEADD(HOUR, -3, r.contacttime)
    WHEN r.Zone = 'CST' THEN DATEADD(HOUR, -1, r.contacttime)
    WHEN r.Zone = 'EST' THEN r.contacttime
    WHEN r.Zone = 'MST' THEN DATEADD(HOUR, -2, r.contacttime)
    ELSE CONVERT(char(10), r.contacttime, 108)
    END 

FROM dbo.table r (nolock)


SELECT 
@portfolio AS 'Product'
, @loannumber AS 'Loan Number'
, CAST(@calldate AS DATE) AS 'Call Date'
, @zipcode AS 'Zip Code'
, CONVERT(char(10), @calltime, 108) AS 'Timezone'
, CONVERT(char(10), @recalctime, 108) AS 'Call Time'
, DATEPART(hh, @recalctime)
, @timezone AS 'Recalc Time'

FROM dbo.table r (nolock)


3 commentaires

Changer de dbo.table R dans la deuxième requête sur à partir dual . Vous voulez juste retourner les valeurs des variables une fois, pas une fois pour chaque ligne de la table.


Je ne sais pas comment la requête supérieure a couru avec succès si votre table dispose de 89 000 lignes car vous ne semblez pas avoir une clause où, mais pour la requête inférieure, supprimez complètement la clause de de . Pour sélectionner uniquement les variables .


Je ne crois pas à partir dual est SQL Server. Ou du moins pas SQL 2012 et avant.


3 Réponses :


2
votes

Votre première requête effectuera l'affectation de Var local pour chaque ligne du tableau, réécrivez cette valeur pour chaque ligne et en finissant de retenir les valeurs dérivées de la dernière ligne. Votre deuxième requête renvoie ces valeurs autant de fois qu'il y a des lignes.

Si vous souhaitez simplement générer vos valeurs dérivées, combinez ces deux requêtes en une seule et n'utilisez pas du tout des variables locales.


0 commentaires

1
votes

La première requête attribue aux variables par ligne qui pourraient ne pas être ce que vous essayez de faire.

En général, la plupart des utilisations de la première requête incluraient une clause où les valeurs se produiraient donc d'une ligne spécifique: p> xxx pré>

Il n'y a pas besoin dans la deuxième requête pour le "de DBO.table" car cela sélectionnera les variables par enregistrement dans la table. P>

SELECT
    [Product] = CASE
        WHEN r.PortfolioID = '10' THEN 'A'
        WHEN r.portfolioid = '11' THEN 'B'
        WHEN r.PortfolioID = '12' THEN 'C'
        ELSE CAST(r.portfolioid AS VARCHAR)
        END 
   -- Note you can also use the 'AS' syntax depending on version of sql server
    , CAST(r.RowCreatedDate AS DATE) AS 'Call Date'
    ...etc        
    FROM dbo.table r (nolock)
    WHERE [MyColumn] = something


0 commentaires

0
votes

Parce que dans le tableau "Dbo.table" dispose de 89 928 lignes totales, c'est-à-dire la raison pour laquelle il montre 89 928 fois.

Vous devez sélectionner uniquement des variables xxx


0 commentaires