Решение Oracle. Во второй строке помещен отчетный год.
mc
подсчитывает новые и уходящие лица в месяц t
- это иерархический подсчет подзапроса opening
и closing
для каждый месяц. Первая часть, якорь, подсчитывает записи в таблицах entry
и resign
в течение более старых лет, это наша отправная точка. К этому якорю мы прикладываем значения по месяцам, просматривая их в mc
pivot
и порядок, добавленный здесь только для представления данных по вашему запросу. Запрос:
with
y as (select 2016 yr from dual),
mc as (
select mm, sum(a) a, sum(c) c
from ( select extract (month from entrydate) mm, 1 a, 0 c
from entry, y where extract(year from entrydate) = yr
union all
select extract (month from resigndate) mm, 0 a, 1 c
from resign, y where extract(year from resigndate) = yr)
group by mm ),
t(mm, o, a, r, c) as (
select 0, 0, 0, 0,
( (select count(1) from entry where extract(year from entrydate) < yr)
- (select count(1) from resign where extract(year from resigndate) < yr) )
from y
union all
select t.mm + 1, t.c, mc.a, mc.c, t.c + nvl(mc.a, 0) - nvl(mc.c, 0)
from t left join mc on mc.mm = t.mm + 1
where t.mm + 1 <= 12)
select *
from (
select * from t
unpivot (cnt for type in (o, a, r, c)))
pivot (sum(cnt) for mm in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
order by case type when 'O' then 1 when 'A' then 2
when 'R' then 3 when 'C' then 4
end
Результат для предоставленных данных и год 2016:
TYPE 1 2 3 4 5 6 7 8 9 10 11 12
---- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
O 0 1 2 3 4 4 4 4 4 4 3 2
A 1 1 1 1 0 0
R 0 0 0 0 1 1
C 1 2 3 4 4 4 4 4 4 3 2 2
Это в основном стандартный SQL, вам могут потребоваться функции изменения, такие как extract
, на их эквивалент SQLServer , Надеюсь, это поможет.
Вы можете определить словарь, ключ как прописные буквы и значение как всевозможную комбинацию этого символа.
rand_dict = {
"A": ["@", "a", "A"],
"B": ["b", "3", "B"],
"C": ["c", "(", "C"],
"D": ["D", "d", "6"],
"E": ["E", "e"],
"F": ["F", "f"],
"G": ["6", "G", "g", "9"],
"H": ["h", "H"],
"I": ["I", "i", "!"],
"J": ["J", "j"],
"K": ["k", "K"],
"L": ["l", "L", "1"],
"M": ["m", "M"],
"N": ["n", "N"],
"O": ["O", "o", "0"],
"P": ["p", "P"],
"Q": ["Q", "q"],
"R": ["R", "r"],
"S": ["s", "S", "$"],
"T": ["T", "t"],
"U": ["U", "u"],
"V": ["v", "V", "<"],
"W": ["w", "W"],
"X": ["x", "X"],
"Y": ["Y", "y"],
"Z": ["z", "Z"],
}
перетасовывают все возможные списки, циклически выводя строку
foo = "MyExGirlFriendIsAnInsult"
bar = []
for i in list(foo.upper()):
random.shuffle(rand_dict[i], random.random)
bar.append(rand_dict[i][0])
print("".join(bar))
как:
Myex9Ir1fR!EnD!s@NInsulT
myEXGiRLfRIeNdI$AnIN$uLT
MYEX6Irlfrien6!$aNInsUlt
MYEXG!R1fr!ENdISAn!nSu1t
myExg!rLFrIEn6is@NiN$u1T
Начните с составления списка со всеми возможными заменами символов. Для краткости я сократил ваш пример, и вы, конечно, захотите встроить его в код, а не указывать список как литерал:
mylist = ["Mm", "yY", "Gg", "I1i" , "rR", "Ll", "Fr", "Ii1", "Ee3", "nN", "dD"]
После того, как у вас есть все параметры, используйте itertools
чтобы получить произведение всех этих опций:
import itertools
for f in itertools.product(*mylist):
print (''.join(f))
Это дает:
MyGIrLFRIEnd
MyGIrLFRIEnD
... 13,820 more ..
mYgiRlfr13Nd
mYgiRlfr13ND