Մեկ էկրան յոթ աղյուսակի փոխարեն
Ամփոփումը Excel-ում — ClickHouse, 296 DAX-չափիչ
Մինչ այդ՝ երեք ֆայլ, երկու չատ, ամեն ուրբաթ՝ «ո՞ւմ մոտ են թարմ թվերը»։ Հիմա՝ մեկ Excel-ֆայլ, «Թարմացնել» սեղմում՝ երեք րոպե, և ամբողջ ընկերությունը մեկ էկրանին։
Ալիքների և մնացորդների չմշակված տվյալները Python-սկրիպտներով հասնում են ClickHouse։ Վրան՝ SQL-պատկերներ՝ բիզնես-տրամաբանությամբ։ Power Query-ն տեսնում է միայն դրանք, մոդելը կրում է 296 DAX-չափիչ։
01Ինչպես էր աշխատում մինչ մեզ
Երբ ընկերությունը վարում է մի քանի խանութ՝ երկու ալիքով, յուրաքանչյուրն իր հարկային կարգով և թիմում մի քանի մարդով, ամեն մեկն ունի իր պատկերը։ Fulfillment-ի պատասխանատուն նայում է մեկ ֆայլ, վաճառքները՝ մյուսը, իսկ սեփականատերն ուզում է ամփոփում, որը ձեռքով հավաքվում է երկու ժամ՝ չորս վեբ-կաբինետից։
Ամեն մեկն իր «ճշմարտությունն» ունի թվերում, և ցանկացած քննարկման առաջին կես ժամը գնում է ոչ թե որոշումներին, այլ պարզելուն, թե ում աղյուսակն է ամենաթարմը։ «Եկեք բոլորս բացենք միևնույն հաշվետվությունը» չէր ստացվում, որովհետև մեկ ընդհանուր հաշվետվություն գոյություն չուներ։
Հաճախորդի թիմն ուներ վաճառքի բաժին, fulfillment-ի մասնագետներ (հետևում էին մնացորդներին և համալրմանն ալիքներում) և վերլուծաբան, որից սպասվում էր ամբողջ պատկերը հավաքել։ Մինչ մեր աշխատանքը՝ յուրաքանչյուր դերն ուներ իր Excel-ը, և այդ Excel-ները չէին համընկնում։ Որտեղ էր կոտրվում, կոնկրետ՝
- Ձեռքով արտահանումներ վեբ-կաբինետներից։ Ամեն մեկը ներբեռնում էր իր կտորը՝ իր ժամին։ Հանդիպման պահին տարբեր մարդիկ ունեին տարբեր կտրվածքներ՝ ուրբաթ vs շաբաթ, Shopify-ի առավոտյան ներբեռնում vs Amazon-ի գիշերային։
- Պլանները կրկնօրինակ-տեղադրմամբ՝ պահեստի համակարգից։ Շաբաթը մեկ ինչ-որ մեկն արտահանում էր պլանի թվերը, պատճենում, կարում։ Շաբաթվա կեսին պլանն արդեն հետ էր մնում իրականությունից։
- Փնտրումները և մակրոները՝ որպես կրող կառույց։ Մատակարարի մեկ վերանվանված սյունակ՝ և աղյուսակը փլվում էր, վերլուծաբանը կես օր ուղղում էր այն։ Տվյալների ամեն փոփոխություն սպառնալիք էր։
- Զուգահեռ իրականություններ։ Fulfillment-ը չէր տեսնում գովազդը, վաճառքները՝ մնացորդը, սեփականատերը տեսնում էր իր ամփոփումը։ Ամբողջ պատկերը հավաքվում էր ձեռքով՝ շաբաթական 3–5 ժամ, անհամապատասխանություններով, որոնք երբեք ամբողջությամբ չէին փակվում։
Ամփոփումը դուրս էր գալիս ուշ, և ամեն հանդիպման առաջին կես ժամը գնում էր «ո՞ւմ թվերն են ճիշտ»-ին՝ որոշումների փոխարեն։
02Ինչ կառուցեցինք
Մեկ ֆայլ՝ ամբողջ ընկերությունը
Արդյունքը՝ մեկ Excel-ֆայլ՝ ներսում Power Pivot-ով։ «Թարմացնել» սեղմում՝ 3–4 րոպեում ամեն ինչ տեղում է՝ Shopify-ի և Amazon-ի վաճառքն ըստ խանութի, գովազդ, մնացորդ՝ բոլոր պահեստներով, ինքնարժեք, ընթացիկ պլաններ։ Առանց ձեռքով հավաքման։
Օպերատիվ ամփոփումը՝ գլխավոր էկրան
Բացելիս սեփականատերն ուղիղ հայտնվում է «Օպ. ամփոփում» թերթի վրա։ Առանցքային աղյուսակ՝ հիմնական ցուցանիշներով ըստ ալիքի, խանութի և ժամանակահատվածի՝ այն, ինչի համար էր առավոտյան հավաքը։
| Ցուցանիշ | Փաստ | Պլան | % պլանին | Ա/Ա |
|---|
* ACoS — գովազդի ծախսը՝ որպես շահույթի մաս։ Նվազող ACoS-ը լավ է ▲, աճողը՝ վատ ▼։
Կանաչն ու կարմիրը «% պլանին» սյունակում հաշվում են չափիչները՝ առանց ձեռքով ձևաչափման։ ACoS-ի համար տրամաբանությունը հակառակն է՝ նվազումը լավ է, աճը՝ վատ։ Սա կարևոր է՝ ACoS-ը ուրախ պատճառներով չի աճում։
Ամսից ամիս դինամիկա
Բաշխում ըստ ապրանքախմբի
Նույն ցուցանիշները՝ ըստ բրենդի և կատեգորիայի։ Ընտրեք խումբ՝ և տեսեք, ինչպես է այն աշխատում ամեն ալիքում՝ պատվերներ, ACoS, պլանի կատարում։
| Խումբ | Shopify | Amazon | ACoS | % պլանին | Շահույթ |
|---|
Ինչ կտրվածքներ կան
Ամբողջ աղյուսակը վարվում է slicer-ներով՝ սեղմեք խանութ կամ բրենդ, և ամեն ցուցանիշ ֆիլտրվում է վայրկյանի կոտորակում՝
| Չափում | Ում է օգնում |
|---|---|
| Ալիք · Shopify / Amazon / Մեծածախ | Բոլոր դերերը |
| Խանութ · [Խանութ A] / B / C | Սեփականատեր, fulfillment-ի պատասխանատու |
| Բրենդ · ապրանքախումբ | Վաճառք, գնումներ |
| Կատեգորիա · ըստ ապրանքատեսակի | Կատեգորիայի մենեջեր, գնումներ |
| Կատեգորիայի պատասխանատու · ըստ ալիքի | Սեփականատեր |
| Ժամանակ · օր / ամիս / սեփական | Բոլոր դերերը |
Մնացորդը՝ միշտ վաճառքի կողքին
«Միջին օրական մնացորդը» համախմբում է գլխավոր պահեստը, Shopify-ի fulfillment-ը, Amazon FBA-ն, fulfillment գնացող ապրանքները և մեծածախ պահեստը։ Եթե վաճառքն աճում է, բայց մնացորդն ընկնում է 30%-ով, fulfillment-ի պատասխանատուն դա անմիջապես տեսնում է՝ նույն էկրանին, առանց առանձին ֆայլի։
Ինչպես է թարմացվում տվյալը
Օգտատերը սեղմում է մեկ կոճակ։ Ոչ մի գաղտնաբառ կամ բանալի մուտքագրելու կարիք չկա՝ դրանք ապրում են ֆայլի ներսում՝ սպասարկող թերթում, ամեն ինչ՝ մեկ անգամ կարգավորված։
Պլանների կառավարում՝ առցանց աղյուսակում
Պլանի թվերն ապրում են Google Drive-ի վրա առցանց աղյուսակում։ Կառուցվածքը պարզ է՝ ամեն տող է ապրանքի կոդ × ամիս × ալիք × տեսակ (հատ կամ ֏)։ Ուզում եք ճշտել պլա՞նը։ Բացեք աղյուսակը, փոխեք թվերը։ Հաջորդ թարմացման ժամանակ դրանք ինքնաշխատ ներքաշվում են. Power Query-ն ներբեռնում է ընթացիկ XLSX-ը, և ամեն ինչ հոսում է մոդել՝ «% պլանին», կուտակային պլան, համեմատում փաստի հետ։
Հարկեր և վճարներ՝ մեկ թերթ, ամեն ինչ վերահաշվարկվում է
Ամեն խանութ ունի իր հարկային ու վճարային պրոֆիլը։ Դրույքներն ապրում են «Խանութներ» թերթի աղյուսակում՝ հենց ֆայլում։ Պրոֆիլը փոխվում է՝ փոխեք դրույքը մեկ բջջում, սեղմեք «Թարմացնել»։ DAX-ը այն քաշում է Dim_Stores փնտրմամբ, և շահույթի չափիչները վերահաշվարկվում են ամեն ժամանակահատվածի և ամեն SKU-ի համար միանգամից։
| Խանութ | Վաճառքի հարկ / ԱԱՀ | Ալիքի վճար | Fulfillment | Վճարում |
|---|---|---|---|---|
| [Խանութ A] | 0% | 12% | $3.20/հատ | 2.9% |
| [Խանութ B] | 8.5% | 15% | $3.90/հատ | 2.9% |
| [Խանութ C] | 8.5% | 15% | FBA | — |
Ամսաթվերի միջակայք՝ մեկ բջիջ
Օրացույցը կառուցվում է դինամիկ։ «Օրացուցային սանդղակ» թերթն ունի երկու դաշտ՝ «Ամսաթիվ-ից» և «Ամսաթիվ-մինչ»։ Փոխեք միջակայքը, և Power Query-ն վերակառուցում է փնտրումը՝ ճիշտ երկարությամբ։ Տարեվերջին պարզապես փոխեք «Ամսաթիվ-մինչ»-ը 31.12.2027՝ և հաջորդ տարին հայտնվում է slicer-ներում։
Ճարտարապետություն
Shopify/Amazon/OMS API-ները
գնում են ուղիղ Power Query
Ալիքների տվյալները ClickHouse են բեռնվում առանձին գործընթացով (Python-սկրիպտներ)։ Չմշակված CH-աղյուսակների վրա նստած են SQL-պատկերներ, որոնք արդեն կրում են բիզնես-տրամաբանությունը՝ ճիշտ տիպեր, կարգավիճակների ֆիլտրեր, խանութների միացումներ։ Power Query-ն տեսնում է միայն դրանք։ Excel-ի կողմում CSV-ի վերլուծություն չկա։
ClickHouse-ի միակցիչը՝ fnCH
ETL-խողովակի առանցքային աղյուսը՝ սեփական fnCH ֆունկցիան է։ Սա Power Query-ի գրառում է, որը ֆայլը բացելիս կարդում է CH_Sources աղյուսակը հենց Excel-թերթից՝ այնտեղ ապրում են բանալիները, օգտատերերն ու գաղտնաբառերը՝ ամեն խանութի համար։
// fnCH — ClickHouse-ի միացման մեթոդներով գրառում let Sources = Excel.CurrentWorkbook(){[Name="CH_Sources"]}[Content], Host = "[IP:8123]", // CH HTTP ինտերֆեյսի հասցե fnFetchSql = (key as text, sql as text) as table => let src = Table.SelectRows(Sources, each [Key] = key){0}, sqlFull = sql & " FORMAT CSVWithNames", data = Table.PromoteHeaders(Csv.Document( Web.Contents(Host, [ Query = [user = src[User], password = src[Password], query = sqlFull] ]) )) in data, fnFetch = (key as text, fullTable as text) => fnFetchSql(key, "SELECT * FROM " & fullTable), fnCombineTagged = (mapping as list) => Table.Combine(List.Transform(mapping, each let src = Table.SelectRows(Sources, each [Key] = _{0}){0} in Table.AddColumn(fnFetch(_{0}, _{1}), "Store", each src[Model label], type text))) in [ Fetch = fnFetch, FetchSql = fnFetchSql, CombineTagged = fnCombineTagged ]
Այդ կառուցիչով հաշվետվությանը նոր խանութ ավելացնելը մեկ տող է՝
// Shopify_Sales — ուղիղ CH-ից, բոլոր խանութները միանգամից Source = fnCH[CombineTagged]({ {"[Խանութ A]", "[db].[view_A]"}, {"[Խանութ B]", "[db].[view_B]"}, {"[Խանութ C]", "[db].[view_C]"} })
Web.Contents-ը Power Query-ի գաղտնիության կարգավորումներում, և միակցիչն աշխատում է ցանկացած Windows-համակարգչի վրա։
Պլանները Google Drive-ով
SKU-ների պլանները պահվում են առցանց աղյուսակներում՝ հարմար թիմի համար. համատեղ խմբագրում, հասանելիություն ցանկացած սարքից։ Power Query-ն դրանք կարդում է որպես Google Drive-ի վրա XLSX-ֆայլ՝ հանրային հղումով՝ ֆայլը ներբեռնվում է ամեն թարմացման ժամանակ։
// GD_Excel_Workbook — Drive-ի XLSX-ը ներբեռնել մեկ անգամ, // օգտագործվում է թե՛ «Պլանների», թե՛ «Գնապատկերի» կողմից let FileId = "https://drive.google.com/uc?id=...", Workbook = Excel.Workbook(Web.Contents(FileId), true) // հետո՝ նավարկել դեպի անվանված թերթ, բարձրացնել վերնագրերը in Workbook
GD_Excel_Workbook հարցումը առանձնացված է. թե՛ պլանները, թե՛ գնապատկերը հղվում են դրան, այնպես որ Drive-ֆայլը ներբեռնվում է ճիշտ մեկ անգամ՝ ամեն թարմացմանը։ Պլանները կազմակերպված են չորս չափումով՝ ապրանքի կոդ × ամսաթիվ (ամսվա 1-ին) × ալիք × տեսակ (հատ / ֏)։
OMS՝ մնացորդ, ինքնարժեք, առաքումներ
Սեփական պահեստի տվյալները OMS-ից քաշվում են երկու ճանապարհով՝
- ClickHouse-ի միջոցով — օրական մնացորդի կտրվածքների համար (Python-սկրիպտը բեռնում է CH, հետո PQ-ն կարդում է այն)։
- Ուղիղ REST API-ով — մեծածախ առաքումների համար.
fnOMS_ShipmentsExpanded-ը հարցում է առաքումներն ըստ պահեստի UUID-ի՝ էջատմամբ։
Power Pivot-ի տվյալների մոդելը
Մոդելը դասական աստղ է։ Կենտրոնական փնտրումները («մեկ» կողմը) ֆիլտրում են ամեն փաստ-աղյուսակ («շատ» կողմը)՝
| Փնտրում | Նպատակ |
|---|---|
| Dim_Products | SKU-ների միասնական կատալոգ՝ բրենդ, կատեգորիա, պատասխանատուներ, հարկային դաս |
| Dim_Stores | Հարկ/վճար դրույքներ և պարամետրեր՝ ըստ խանութի |
| Dim_Calendar | Ամսաթվի հիերարխիա՝ օր → ամիս → եռամսյակ → տարի |
| Dim_Channel | Shopify / Amazon / Մեծածախ |
| Shopify products | variant ID՝ SKU, բրենդ, կատեգորիա, խանութ |
| Amazon catalog | ASIN / SKU՝ վերնագիր, մարքեթինգային գին |
Հիմնական փաստ-աղյուսակները՝ Shopify_Sales (~650հզ տող), Amazon_Transactions (~500հզ տող), ձագարի ագրեգատներ, գովազդի վիճակագրություն, օրական մնացորդ։
Dim_Products-ի և Shopify-աղյուսակների միջև ակտիվ կապն անցնում է sku → code-ով, Amazon-ի համար՝ seller_sku → code-ով։ Եթե ակտիվ կապն արդեն կա, երկրորդն ինքնաշխատ ոչ-ակտիվ է. ոչ-ակտիվ ճանապարհներով DAX-չափիչներին պետք է FILTER + CONTAINS՝ պարզ CALCULATE-ի փոխարեն։
Հիմնական DAX-չափիչներ
Ընդամենը 296 չափիչ։ Մի քանի բնորոշ՝
ACoS — շահույթից, ոչ թե հասույթից՝
-- Shopify ACoS (շահույթից), % IF([Փաստ շահույթ, Shopify], DIVIDE( [ALL_Ad_Spend] - [Shopify ad tax], [Փաստ շահույթ, Shopify] + ([ALL_Ad_Spend] - [Shopify ad tax]) ) )
Սա «գովազդի ծախսը՝ որպես հասույթի մաս» չէ, այլ «որքա՞ն գովազդը կերավ շահույթից»՝ սկզբունքորեն տարբեր թվեր, երբ վճարներն ու ինքնարժեքը բարձր են։
Փաստ շահույթ, Shopify — շերտավոր հավաքում՝
-- Փաստ շահույթ, Shopify
[Shopify զուտ հասույթ վճարներից և վճարումից հետո, ֏]
- (
[Shopify COGS, ֏]
+ [Shopify բոլոր ծախսերը՝ բացի հարկերից և վճարներից]
+ [Shopify ֆիքսված ներքին ծախսեր]
+ [Հարկ, վաճառքի հարկ վաճառքում, Shopify]
+ [Հարկ, եկամուտ, Shopify]
+ [Հարկ, fulfillment, Shopify]
+ [Հարկ, վճարում, Shopify]
)
+ [Հարկ, ԱԱՀ ներառված ծառայություններում, Shopify]
+ [Հարկ, ԱԱՀ ներառված COGS-ում, Shopify]
Ծախսի ամեն տող իր չափիչն է։ Կարող եք մտնել ցանկացած կտրվածք և տեսնել, թե կոնկրետ ինչն է ճնշում շահույթին՝ ալիքի վճար, հարկեր, լոգիստիկա, գովազդ։ Ոչ թե «շահույթն ընկավ», այլ կոնկրետ պատճառը։
Պլանները՝ օրական բաշխմամբ՝
-- Plans_Shopify (օրական արժեքներով) -- Ամսական պլանը բաշխվում է ամսվա փաստացի վաճառքի օրերին SUMX( SUMMARIZE('Dim_Calendar', [Year], [Month]), VAR MonthStart = DATE([Year], [Month], 1) VAR DaysInMonth = DAY(EOMONTH(MonthStart, 0)) VAR MonthlyPlan = CALCULATE( SUM('Plans'[Value]), 'Plans'[Channel] = "Shopify", 'Plans'[Plan type] = "Units", 'Plans'[Date] = MonthStart, ALL('Dim_Calendar') ) VAR DailyPlan = DIVIDE(MonthlyPlan, DaysInMonth, 0) VAR DaysInContext = COUNTROWS('Dim_Calendar') RETURN DailyPlan * DaysInContext )
Չափիչը հաշվում է կուտակային պլանը մինչ ընթացիկ օրը՝ ոչ թե ամբողջ ամիսը։ Նայեք 15-ին՝ պլանը «կտրված» է ճիշտ մինչ 15-ը, որպեսզի փաստի հետ համեմատումը ճիշտ լինի առանց ձեռքով ճշգրտման։
03Ժամանակացույց և արդյունք
| Փուլ | Ամսաթիվ |
|---|---|
| Նախագծի մեկնարկ, աղբյուրների աուդիտ | Նոյեմբեր 2025 |
| MVP՝ առաջին աշխատող տարբերակը (Shopify) | Հունվար 2026 |
| Amazon-ի, գովազդի, պլանների, մնացորդի ավելացում | Փետրվար–Մարտ 2026 |
| Ֆինանսական մոդել, շահույթ՝ ըստ խանութի | Ապրիլ–Մայիս 2026 |
Նմա՞ն խնդիր ունեք ձեր կողմում
Պատմեք՝ 30 րոպեում կպարզենք, թե ինչն է հնարավոր։
