Борьба с получением результатов (Представления, Переменные, StoredProcedures) - PullRequest
0 голосов
/ 30 апреля 2019

Насколько я понимаю, вы не можете создать представление с переменными.Дилемма заключается в том, что я должен сделать несколько датировок ценностей.Наше стороннее программное обеспечение для создания отчетов может выполнять только базовые операции выбора таблиц или представлений.Я не могу вызвать какие-либо хранимые процедуры или установить переменные там.

Мои исходные данные выглядят select * from tblquotestatuschangelog Результаты, поэтому я хотел бы видеть эти результаты

Quotenumber   UpdatedOn    Status    UpdatedBy
----------------------------------------------
100001     04102019     Open      domain/user
100001     04132019     Closed    domain/user

Я сделал разворот этих данных, чтобы получить результаты в нужном формате сэтот запрос.(Существует больше типов состояний, чем в этом примере, и через CRM, которую мы используем, можно добавить больше) (Q1)

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(T1.STATUS) 
            FROM tblCglQuoteStatusChangeLog as T1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT quotenumber, ' + @cols + ' from 
            (
                select quotenumber, status, updatedon, updatedby
                from tblcglquotestatuschangelog
                where updatedon > 2019-04-01
           ) x
            pivot 
            (
                 max(updatedon)
                for status in (' + @cols + ')
            ) p '

execute @query 

Чтобы получить эти результаты

Quotenumber   Open    Closed       
----------------------------------------------
100001     04102019     04132019

Iхотел бы вызвать (Q1) как представление для выполнения

     Select
         QuoteNumber, 
         case when datediff(day,Open, Closed) = 0 then Cast('SAMEDAY' AS NVARCHAR(20)) else cast(datediff(day,openedon,updatedon) as NVarCHAR(20)) end as TotalAge,
         datediff(day,Open,SentToCustomer) as Stage1,
         datediff(day,SentToCustomer,) as Stage2,
     From V1

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

1 Ответ

0 голосов
/ 30 апреля 2019

Вы можете использовать условное агрегирование для достижения ваших результатов - если вы хотите полагаться на предположения о форме ваших данных. Это ваши ответы на мои вопросы - что кортеж уникален и что есть только 2 значения статуса. Если у вас есть больше значений состояния (и пахнет, как у вас), вы можете расширить логику

use tempdb; 
set nocount on;
go

if object_id('v1') is not null 
drop view v1;
if object_id('chglog') is not null
drop table chglog;
go


create table chglog (IdNumber int not null, UpdatedOn date not null, Status varchar(10) not null, UpdatedBy varchar(20) not null
constraint chg_unique unique (IdNumber, Status),
constraint chg_check check (Status in ('Open', 'Closed')) 
); 

insert chglog(IdNumber, UpdatedOn, Status, UpdatedBy) 
values (100001, '20190410', 'Open', 'domain/user'), (100001, '20190413', 'Closed', 'domain/user'), 
(9999, '20190401', 'Open', 'zork'),
(99001, '20190402', 'Open', 'bob'),
(99001, '20190402', 'Closed', 'alice')
;
go

-- setup complete, now create a view to do a hard-coded pivot
create view v1 as 
select IdNumber, 
max(case Status when 'Open' then UpdatedOn else null end) as 'Open', 
max(case Status when 'Closed' then UpdatedOn else null end) as 'Closed'  
from chglog
group by IdNumber;
go

-- test the view
select * from v1 
order by IdNumber;

-- now the query that you wanted to write/use 
Select
IdNumber, 
case when datediff(day, [Open], Closed) = 0 then N'SAMEDAY' else cast(datediff(day, [Open], Closed) as nvarchar(20)) end as TotalAge
--         datediff(day,Open,SentToCustomer) as Stage1,
--         datediff(day,SentToCustomer,) as Stage2,
from v1
order by IdNumber; 

Я укажу, что ваша "таблица" содержала IdNumber, но ваш последний запрос ссылался на QuoteNumber (как и другие столбцы, которые вы не упомянули). Я просто проигнорировал некоторые и угадал некоторые. Это просто поворот в старом стиле на основе жестко закодированных значений. Если вы заранее знаете значения, которые необходимо учитывать при повороте, и знаете, что домен не изменяется (или не заботитесь о других значениях), это будет то, что вы просили.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...