Биты и байты.

Биты и байты.
Показаны сообщения с ярлыком QlikView. Показать все сообщения
Показаны сообщения с ярлыком QlikView. Показать все сообщения

понедельник, 21 сентября 2015 г.

Полезные советы при создании аналитических панелей.

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

Шаг 1.  Создайте образ панели.
 Для начала ответьте себе на вопросы.

- Какую мысль я хочу донести людям, в чем ценность этой панели ? 
(от этого будет зависеть наполнение панели информацией)
- Кто будет пользоваться этой информацией, кто целевая аудитория ? 
(насколько они технически грамотны, знакомы с терминологией  от этого будет зависеть              сложность панели, количество данных и графиков )
- Какой тип панели это будет ?
 (стратегическая, оперативная, в виде истории,  детализация)

Подсказка : представьте вашу панель создайте ее в голове , если есть возможность нарисуйте набросок карандашом.



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


Подсказка: В интернете есть разные варианты макетов на выбор, попробуйте создать свой макет в каком-нибудь онлайн дизайнере или используя Gridstack.js

среда, 11 декабря 2013 г.

Qlikview основы

Небольшая памятка по работе с Qlik.
1.Загружаем данные, создаем новый файл жмем  Ctrl+E, или редактор скрипта
2. Подготавливаем данные для внутренней модели пишем загрузочный скрипт
Модель создается автоматически по одноименным полям.   Поэтому переименовываем в источнике  или с помощью  псевдонимов AS
Проверить модель можно нажав Ctrl + T

Самый простой пример скрипта по загрузке на примере файлов QVD

///$tab Main
SET ThousandSep=',';
SET DecimalSep='.';
SET MoneyThousandSep=',';
SET MoneyDecimalSep='.';
SET MoneyFormat='$#,##0.00;($#,##0.00)';
SET TimeFormat='h:mm:ss TT';
SET DateFormat='M/D/YYYY';
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff] TT';
SET MonthNames='Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec';
SET DayNames='Mon;Tue;Wed;Thu;Fri;Sat;Sun';

//=========================================================

LET vTodaysDate = num(Makedate(Year(today()), 6, 30));
LET vAdj =  $(vTodaysDate) - Makedate(2004, 6, 30);



///$tab Mapping
ProductCostMap:
MAPPING LOAD DISTINCT
                ProductID,
    StandardCost
FROM
                ProductCostMap.QVD (qvd)
;

///$tab Orders
OrderHeader:
Load
                SalesOrderID,
    RevisionNumber,
    Date(OrderDate + $(vAdj)) as OrderDate,
    Date(DueDate + $(vAdj)) as DueDate,
    Date(ShipDate + $(vAdj)) as ShipDate,
    Status,
    OnlineOrderFlag,
    SalesOrderNumber,
    PurchaseOrderNumber,
    AccountNumber,
    CustomerID,
    ContactID,
    SalesPersonID,
    TerritoryID,
    BillToAddressID,
    ShipToAddressID,
    ShipMethodID,
    CreditCardID,
    CreditCardApprovalCode,
    CurrencyRateID,
    SubTotal,
    TaxAmt,
    Freight,
    TotalDue,
    Comment
FROM
                OrderHeader.QVD (qvd)
WHERE
                OrderDate + $(vAdj) <= $(vTodaysDate) and Year(OrderDate + $(vAdj)) >= Year($(vTodaysDate)) - 2
;



[Order Detail]:
LOAD
                SalesOrderID,
    SalesOrderDetailID,
    CarrierTrackingNumber,
    OrderQty,
    ProductID,
    SpecialOfferID,
    UnitPrice,
    UnitPriceDiscount,
    LineTotal as SalesAmount,
                LineTotal - (ApplyMap('ProductCostMap', ProductID, 1)*OrderQty) as MarginAmount,
    ApplyMap('ProductCostMap', ProductID, 1) as CostAmount
FROM
                OrderDetail.QVD (qvd)
WHERE
                EXISTS(SalesOrderID)
;

///$tab Calendar
Calendar:
LOAD DISTINCT
                OrderDate,
                Year(OrderDate) as Year,
                Month(OrderDate) as Month,
                Date(Monthstart(OrderDate), 'MMM-YYYY') as YearMonth,
                'Q' & Ceil(Month(OrderDate)/3) as Quarter,
                Dual(Year(OrderDate) & '-Q' & Ceil(Month(OrderDate)/3), Year(OrderDate) & Ceil(Month(OrderDate)/3)) as YearQtr,
                Week(OrderDate) as Week
RESIDENT
                OrderHeader;  
///$tab Products
Product:
LOAD
                ProductID,
    Name as ProductName,
    ProductNumber & ' : ' & Name as Product,
    ProductNumber,
    MakeFlag,
    FinishedGoodsFlag,
    Color,
    SafetyStockLevel,
    ReorderPoint,
    StandardCost,
    ListPrice,
    Size,
    SizeUnitMeasureCode,
    WeightUnitMeasureCode,
    Weight,
    DaysToManufacture,
    ProductLine,
    Class,
    Style,
    ProductSubcategoryID,
    ProductModelID,
    SellStartDate,
    SellEndDate,
    DiscontinuedDate
FROM
                Product.QVD (qvd)
WHERE
                EXISTS(ProductID)
;



ProductSubCategory:
LOAD
                ProductSubcategoryID,
    Name as ProductSubcategoryName,
    ProductCategoryID
FROM
                ProductSubCategory.QVD (qvd)
WHERE
                EXISTS(ProductSubcategoryID)
;



ProductCategory:
LOAD
                ProductCategoryID,
    Name as ProductCategoryName
FROM
                ProductCategory.QVD (qvd)
WHERE
                EXISTS(ProductCategoryID)
;



///$tab Customer
Customer:
LOAD
                CustomerID,
                LastName & ', ' & FirstName as CustomerName,
                CustomerID & ' - ' & LastName & ', ' & FirstName as Customer,
                Phone,
    EmailAddress,
    EmailPromotion,
    Title
FROM
                Customer.QVD (qvd)
WHERE
                EXISTS(CustomerID)
;


vIndividualDemographics:
LOAD
                CustomerID,
    TotalPurchaseYTD,
    DateFirstPurchase,
    Date(BirthDate) as BirthDate,
    MaritalStatus,
    YearlyIncome,
    Gender,
    if(TotalChildren > 0, 'YES', 'NO') as [Have Child(ren)],
    TotalChildren,
    NumberChildrenAtHome,
    Education,
    Occupation,
    HomeOwnerFlag,
    NumberCarsOwned
FROM
                vIndividualDemographics.QVD (qvd)
WHERE
                EXISTS(CustomerID)
;


[Customer Type]:
Load
                CustomerID,
                if(CustomerType = 'S','STORE',if(CustomerType='I', 'INDIVIDUAL', CustomerType)) as CustomerType
FROM
                CustomerType.QVD (qvd)
WHERE
                EXISTS(CustomerID)
;


BillToAddress:
LOAD
                BillToAddressID,
                AddressLine1,
                AddressLine2,
                City,
                StateProvinceID,
                PostalCode,
                CountryRegionCode,
                [State / Province],
                Country
FROM
                BillToAddress.QVD (qvd)
WHERE
                EXISTS(BillToAddressID)
;

               


среда, 13 ноября 2013 г.

Qlikview основы - Способы загрузки данных

Способы загрузки данных в QlikView

1    1.Loading data from the file.
Этот метод обычный метод загрузки данных в приложении QlikView.
Загрузка данных из файлов, таких как Excel, MSDB, CSV, TXT файлы и т.д., может быть сделано путем создания ODBC и подключения к базе данных напрямую.

ACCOUNTS:
LOAD ACCOUNT_CODE,
     
ACCOUNT_KEY,
     
ACCOUNT_CODE_NAME,
     
ACCOUNT_OWNR,
     
ACCOUNT_ORDR
FROM
[C:\Data\Finance_report_source data.xlsx]
(
ooxml, embedded labels, table is Account);

<    2.    Inline Load
Второй способ загрузки - встроенная загрузка, когда пользователь может определить свои собственные данные и загрузить в QlikView.
Встроенные данные могут быть определены через встроенный мастер данных.
EMPLOYEES
LOAD * INLINE [
    EMPLOYEE_KEY,EMPLOYEE_NAME
    1, Jack
    2, Bob
    3, Bill
]
;
<    3.    Resident Load
Загрузка данных из уже загруженной таблице QlikView можно с помощью загрузки с указанием внутренней таблицы.
Преобразования и расчеты могут быть выполнены в резидентном сценарии загрузки.
RATES:
LOAD Дата,
     
Единиц,
     
Курс
FROM
[http://cbr.ru/currency_base/dynamics.aspx?VAL_NM_RQ=R01235&date_req1=01.01.2013&r1=1&date_req2=12.11.2013&C_month=01&C_year=2013&rt=1&x=36&y=8&mode=1]
(
html, utf8, embedded labels, table is @41);

LOAD Дата,
     
Единиц,
     
Курс,
    
Единиц*Курс as 'Объем'
RESIDENT RATES;

Qlikview основы - Объединение таблиц

Сегодня потребовалось объединить несколько таблиц непосредственно в QlikView, но вот засада есть две команды JOIN и  CONCATENATE
Пора раз и навсегда разобраться что и когда нужно использовать …..
JOIN – позволяет добавить новые столбцы в таблицу
CONCATENATE  - совместить данные из двух таблиц (аналог UNION SQL)
Есть еще интересный оператор KEEP (позволяет выровнять таблицы по количеству записей в зависимости от LEFT RIGHT INNER)


Как работает CONCATENATE 
Если напрямую загрузить две таблицы например сотрудников двух компаний то если открыть модель можно увидеть что они связаны
через вспомогательную таблицу $Syn 1

 

И наша схема выглядит так..
что по мере разрастания количества таблиц  будет напоминать большую кашу, дабы все это привести в человеческий вид воспользуемся CONCATENATE 
1..Неявное связывание (QlikView должен был автоматически сам связать эти таблицы по одинаковым полям, но так как количество полей в таблицах не совпадает связать не получилось )
Как выход добавить еще одно поле Department в таблицу Stamford Employees и таблицы свяжутся сами автоматически
2..Можно отменить неявное связывание если указать ключевое слово перед таблицей NOCONCATENATE 


3.. Явное связывание (определенно лучше чем неявное, есть возможность связать таблицы с разным набором полей)
Указываем секретное слово  CONCATENATE в скобочках пишем таблицу в которую сливаем данные


Qlikview основы - Изменить таблицу в отчете без обновления

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

1.Копируем этот скрипт в наш документ, обязательно должны быть слова ADD NOCONCATENATE для частичной загрузки
2.Меняем  названия таблиц  на ваши таблицы
SALES – исходная таблица
SALES_TEMP – временная таблица
3.Запускаем частичную загрузку и видим что, лишние удалились благополучно!

/* Example loadscript fragment to adjust a table */
/* Put this code at the top of the loadscript and */
/* then run a Partial Reload. */
/* Remove this fragment after using it. */

//Rename the table we want to change
RENAME TABLE SALES TO SALES_TEMP;

//Rebuild table with a WHERE clause
SALES:
ADD NOCONCATENATE LOAD * RESIDENT SALES_TEMP
WHERE Data >'01.11.2013';

// Drop the original table
DROP TABLE SALES_TEMP;

//so that we don't fall into the regular loadscript
EXIT SCRIPT;



И немного сладенького на десерт….

Qlikview основы - Экспорт данных

Допустим понабилось нам например данные из Qlikview выгрузить в другую систему, как это сделать?
Как два пальца….
1..Берем наш документ, создаем его копию в отдельной папке, чтобы не затронуть основной документ.
2..Копируем этот скрипт в начало документа, весь смысл скрипта, привязываем  экспорт к частичной загрузке

/* Export all QlikView tables to tab-delimited files */
if IsPartialReload() then
for ix= 0 to 100
let tn=trim(tablename($(ix)));
if len('$(tn)')<1 then
exit script;
end if
Store "$(tn)" into "EXPORTED_QV_$(tn).TXT" (txt, delimiter is "\t");
next ix
end if
exit script;

Должно получиться что-то вроде этого


Сохраняем, и в меню Файл – выбираем частичная загрузка и файлы готовы в нашей папке EXPORTED_QV_@41.TXT


+ немного улыбок

Плюшки QlikView (Эпизод 2) - Комментарии и совместные сессии

1.. Это обмен комментариями и снимками отчетов (они же Snapshots), можно легко сравнить две различные версии отчета практически на лету и поболтать с коллегой в заметках!
До социальной сети конечно не дотягивает, но адски удобно))
2.. Поделись сессией с другом (не той конечно же что в институте),  копируем ссылку и отправляем ее другу в течении 15 мин  вы сможете вместе управлять одной и той же версией отчета и видеть действия друг друга,
И самое главное за это не надо платить…..))
Главное включить опцию совместных сессий в management console.

Юзабилити QlikView просто зашкаливает) Надеюсь в 12 версии будут еще более приятные плюшки….


Как включить Session Collaboration


И как всегда в конце веселье…

вторник, 12 ноября 2013 г.

Плюшки QlikView (Эпизод 1) - Загрузка с веб страниц

Понадобилось случайно вдруг в отчет курсы валют подтянуть, оказалось совсем просто с QlikView, буквально пару кликов и данные уже в отчете.
Раньше приходилось писать небольшие парсеры для ETL, а тут уже все встроено, мелочь а приятно))
Было бы шикарно на случай если структура страницы изменится, выбрать по названию таблицу или по свойству атрибута.


Открываем отчет и анализируем до потери пульса……


И напоследок немного юмора….

Знакомство с QlikView (часть 1)


Знакомство с  QlikView
С первого взгляда, имеет типичную архитектуру, вся суета крутится вокруг qvw документов, они же будущие отчеты и аналитические панели в итоге,

Qlikview документ хранит ваши данные внутри своих документов в 2х уровнях: список уникальных значений, и связи между этими значениями-указатели.

С помощью настроенных скриптов для импорта данных из источников, документ импортирует данные к себе во внутреннюю структуру и затем уже вертит и крутит их  в оперативной памяти .
Разработчик в толстом клиенте (так называемый qlikview desktop edition) разрабатывает у себя этот документ,
затем копирует этот документ в специальный каталог на сервере и отчет становится доступным обычным пользователям через web браузер.


понедельник, 11 ноября 2013 г.

QlikView Cheat Sheet

Офигенная штука – QlikView ЧИТ ШИТ)
Для тех кто рубит по английски…

Qlikview v10 set analysis identifiers
0
Empty set
1
Full set of all the records
$
Current selection
$1
Previous selection
$_1
Forward selection
Bookmark01
Bookmark ID or name
Qlikview v10 set analysis operators
+
Union
-
Exclusion (first but not the other)
*
Inters­ection (both)
/
Symmetric difference (either but not both)
Qlikview v10 set analysis modifiers
<Or­derDate = Delive­ryD­ate>
Select only data where field1 = field2
<Field = {value­}>
Select specific value
<Region = >
Ignore the specific field
<Ye­ar=­{2000}, Region = {"U*­"­}>
Two fields can be filtered, with wildcards
Qlikview v10 set analysis examples
sum(sales) orsum({$} sales)
sales in current selection
sum({1} sales})or sum({1} Total sales})
sales disreg­arding the selection or disreg­arding selection and dimension
sum({$­<Or­derDate = Delive­ryD­ate­>} sales)
sales in current selection for a specific date
sum({1­<Region = {US}>} sales)
total sales for region=US
sum({<­Region = >} sales)
sales in selection with region removed (idem $)
sum({$­<Ye­ar=­{2000}, Region = {"U*­"­}>} sales)
current selection but year forced to 2000 and region like U*
sum({$­<Year = {$(vLa­stY­ear­)}>} sales)
sales related to a variable
p({<Ye­ar=­{$(­=ma­x(Y­ear­)-1­)}>} customer)
returns customers who are possible for last year
e({<Ye­ar=­{$(­=ma­x(Y­ear­)-1­)}>} customer)
returns customers who are excluded for last year

заценить все

пятница, 1 ноября 2013 г.

Как вкусно приготовить на QlikView

Как вкусно приготовить на QlikView, Стивен Редмонд
Как из обычного пользователя переквалифицироваться в гуру)) 

Пока доступно качаем по ссылке

Влом качать?) зацени у гугла

Еще одна полезная книга
QlikView 11 справочное руководство


About