Я переформатировал ваш код с примечаниями:
declare @u_cnt int, @f_yr date, @qrt varchar(3), @dnum varchar(5);
select @u_cnt = 10000, @f_yr = '20020520', @qrt = 'Q2', @dnum = '43234';
select c.GroupLabel as ORG_CODE
-- Assuming c.changedate is datetime, otherwise cast(c.changedate as datetime)
, format(c.changedate, 'MM-yyyy') as [MONTH]
, count(distinct case s.TestType when 'IR' then c.changedate else null end) as IR_TEST_DAYS
, count(distinct c.changedate) as TEST_DAYS
, count(s.Id) as TOTAL
, (case when (@u_cnt is null) then - 1 else @u_cnt end) as BOARD_CNT
, format((count(s.Id) /
-- avoiding also division by 0
case when isnull(@u_cnt, 0) = 0
then - 1
else @u_cnt end), 'P0')
as PCT
, case
when 100 * (count(s.Id) /
-- avoiding also division by 0
case when isnull(@u_cnt, 0) = 0
then - 1
else @u_cnt
end) >= 15
and (count(distinct case s.TestType
when 'IR' then c.changedate else null
end)) >= 4
then 'Yes' else 'NO'
end as PCT_TEST_COMP
from cforms c
join spitems s on (c.Id = s.FormId)
where c.group = 'HR'
and c.bFlag is null
and s.Report in ('P', 'N')
and convert(varchar(6), c.changedate, 112) in -- yyyymm (ISO format)
(
select
cast(year(@f_yr) +
case
when f.Quarter = 'Q1'
then (-1)
when f.Quarter = 'ALL'
and f.FyMonthNumber in ('10', '11', '12')
then (-1)
else (0)
end as varchar(4))
+ f.FyMonthNumber -- JAN = '01' or '1' ?
from FyQm f
where f.Quarter = @qrt
)
and c.GroupLabel = 'Hr' + @dnum
group by c.GroupLabel
-- Assuming c.changedate is datetime, otherwise cast(c.changedate as datetime)
, format(c.changedate, 'MM-yyyy')
order by ORG_CODE, [MONTH];
Не могли бы вы проверить, является ли FyQm.FyMonthNumber varchar(2)
или char(2)
и представляет январь как ' 01 ' вместо ' 1 '?
Вот то, что я закончил тем, что использовал с тех пор, кажется, нет встроенного метода для выполнения, что я хочу. Эта функция должна быть достаточно родовой, который она может считать в потоке YAML и возвратить объекты верхнего уровня, поскольку с ними встречаются.
def streamInYAML(stream):
y = stream.readline()
cont = 1
while cont:
l = stream.readline()
if len(l) == 0:
cont = 0
else:
if l.startswith(' '):
y = y + l
else:
yield yaml.load(y)
y = l
Кто-либо может добиться большего успеха?
Все ссылки на поток в документация, кажется, относятся к потоку документов... Я никогда не пытался использовать его в способе, которым Вы описываете, но кажется, что разделение на блоки данных в такой поток документов является разумным подходом.