Запрос, возвращающий одну и ту же строку несколько раз - PullRequest
0 голосов
/ 28 сентября 2019

Мой запрос возвращает один результат несколько раз.Я знаю, что ответ должен быть простым, но я в тупике.Любая помощь приветствуется.

Мой код указан ниже.

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)

Я получаю 89 928 строк с одинаковым результатом.

Ответы [ 3 ]

2 голосов
/ 28 сентября 2019

Ваш первый запрос выполнит локальное назначение переменных для каждой строки в таблице, переписав это значение для каждой строки и в конечном итоге удерживая значения, полученные из последней строки.Ваш второй запрос возвращает эти значения столько раз, сколько строк.

Если вы просто хотите вывести свои производные значения, объедините эти два запроса в один и вообще не используйте локальные переменные.

1 голос
/ 28 сентября 2019

В первом запросе присваиваются переменные для каждой строки, что может не соответствовать тому, что вы пытаетесь сделать.

Как правило, в большинстве случаев использования первого запроса используется предложение where, поэтому значения будут взяты изконкретная строка:

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)
WHERE [MyColumn] = something

Во втором запросе «from dbo.table» нет необходимости, поскольку при этом будут выбраны переменные для каждой записи в таблице.

 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'

;

Если вы не используете переменные для чего-либо еще, вы можете объединить все это в один запрос:

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 голосов
/ 28 сентября 2019

Поскольку в таблице "dbo.table" всего 89 928 строк, по этой причине она показывает 89 928 раз.

вам нужно выбрать только переменные

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...