Կեյսեր/ Էլ. առևտուր/ Օպերատիվ ամփոփում

Մեկ էկրան յոթ աղյուսակի փոխարեն

Ամփոփումը Excel-ում — ClickHouse, 296 DAX-չափիչ

Մինչ այդ՝ երեք ֆայլ, երկու չատ, ամեն ուրբաթ՝ «ո՞ւմ մոտ են թարմ թվերը»։ Հիմա՝ մեկ Excel-ֆայլ, «Թարմացնել» սեղմում՝ երեք րոպե, և ամբողջ ընկերությունը մեկ էկրանին։

Ալիքների և մնացորդների չմշակված տվյալները Python-սկրիպտներով հասնում են ClickHouse։ Վրան՝ SQL-պատկերներ՝ բիզնես-տրամաբանությամբ։ Power Query-ն տեսնում է միայն դրանք, մոդելը կրում է 296 DAX-չափիչ։

Օպերատիվ ամփոփում Պլան / փաստ ACoS · շահույթ · մնացորդ Shopify · Amazon ClickHouse + Power Pivot 2.5 ամիս մինչ MVP
Ոլորտ Սպառման ապրանքներ՝ խաղալիքներ և ուսուցողական հավաքածուներ · Մի քանի խանութ՝ Shopify-ում և Amazon-ում · Սեփական պահեստ + marketplace-ի fulfillment + մեծածախ
Ղեկի մոտ Ինչ են բացում առավոտյան, որտեղ են փոխում թվերը, ինչն է հասկանալի առաջին հայացքից՝ առանց գործընկերոջը զանգելու։ Ինժեներական կողմը՝ վերևի աջ անկյունի փոխարկիչով։
Կապոտի տակ Ճարտարապետություն, fnCH միակցիչ, ETL-շղթա, հիմնական DAX-չափիչներ։ Օգտատիրոջ աչքերով տեսնելու համար՝ վերևի աջ անկյունի փոխարկիչը։
Ամփոփման հավաքում 0 րոպե ▼ էր 3–5 ժամ
Աղբյուրներ 1 ֆայլ ▲ 4–7 աղյուսակի փոխարեն
Փնտրման սխալներ 0 ▲ վերացված
«Ճշմարտության» տարբերակ 1 ▲ էր՝ յուրաքանչյուրն իրենը

01Ինչպես էր աշխատում մինչ մեզ

Երբ ընկերությունը վարում է մի քանի խանութ՝ երկու ալիքով, յուրաքանչյուրն իր հարկային կարգով և թիմում մի քանի մարդով, ամեն մեկն ունի իր պատկերը։ Fulfillment-ի պատասխանատուն նայում է մեկ ֆայլ, վաճառքները՝ մյուսը, իսկ սեփականատերն ուզում է ամփոփում, որը ձեռքով հավաքվում է երկու ժամ՝ չորս վեբ-կաբինետից։

Ամեն մեկն իր «ճշմարտությունն» ունի թվերում, և ցանկացած քննարկման առաջին կես ժամը գնում է ոչ թե որոշումներին, այլ պարզելուն, թե ում աղյուսակն է ամենաթարմը։ «Եկեք բոլորս բացենք միևնույն հաշվետվությունը» չէր ստացվում, որովհետև մեկ ընդհանուր հաշվետվություն գոյություն չուներ։

Հաճախորդի թիմն ուներ վաճառքի բաժին, fulfillment-ի մասնագետներ (հետևում էին մնացորդներին և համալրմանն ալիքներում) և վերլուծաբան, որից սպասվում էր ամբողջ պատկերը հավաքել։ Մինչ մեր աշխատանքը՝ յուրաքանչյուր դերն ուներ իր Excel-ը, և այդ Excel-ները չէին համընկնում։ Որտեղ էր կոտրվում, կոնկրետ՝

Ամփոփումը դուրս էր գալիս ուշ, և ամեն հանդիպման առաջին կես ժամը գնում էր «ո՞ւմ թվերն են ճիշտ»-ին՝ որոշումների փոխարեն։

02Ինչ կառուցեցինք

Մեկ ֆայլ՝ ամբողջ ընկերությունը

Արդյունքը՝ մեկ Excel-ֆայլ՝ ներսում Power Pivot-ով։ «Թարմացնել» սեղմում՝ 3–4 րոպեում ամեն ինչ տեղում է՝ Shopify-ի և Amazon-ի վաճառքն ըստ խանութի, գովազդ, մնացորդ՝ բոլոր պահեստներով, ինքնարժեք, ընթացիկ պլաններ։ Առանց ձեռքով հավաքման։

Ամփոփման հավաքման ժամանակ՝ 0 րոպե։ Ամենօրյա թարմացումն ավտոմատ է։ Սեփականատերը բացում է ֆայլը, և տվյալներն արդեն ներսում են։

Օպերատիվ ամփոփումը՝ գլխավոր էկրան

Բացելիս սեփականատերն ուղիղ հայտնվում է «Օպ. ամփոփում» թերթի վրա։ Առանցքային աղյուսակ՝ հիմնական ցուցանիշներով ըստ ալիքի, խանութի և ժամանակահատվածի՝ այն, ինչի համար էր առավոտյան հավաքը։

Օպ. ամփոփում · վաճառք տվյալներ՝ 24 մայիսի դրությամբ · ավտո-թարմացված
սինթետիկ տվյալներ · կառուցվածքը համընկնում է աշխատանքային մոդելի հետ
Ալիք
Խանութ
Ժամանակ
Ցուցանիշ Փաստ Պլան % պլանին Ա/Ա

* ACoS — գովազդի ծախսը՝ որպես շահույթի մաս։ Նվազող ACoS-ը լավ է ▲, աճողը՝ վատ ▼։

Կանաչն ու կարմիրը «% պլանին» սյունակում հաշվում են չափիչները՝ առանց ձեռքով ձևաչափման։ ACoS-ի համար տրամաբանությունը հակառակն է՝ նվազումը լավ է, աճը՝ վատ։ Սա կարևոր է՝ ACoS-ը ուրախ պատճառներով չի աճում։

Ամսից ամիս դինամիկա

Պատվերներն ըստ ամիսների, ֏ թարմացվում է ալիքը փոխելիս

Բաշխում ըստ ապրանքախմբի

Նույն ցուցանիշները՝ ըստ բրենդի և կատեգորիայի։ Ընտրեք խումբ՝ և տեսեք, ինչպես է այն աշխատում ամեն ալիքում՝ պատվերներ, ACoS, պլանի կատարում։

Ապրանքախմբեր · Shopify vs Amazon մայիս · փաստ vs պլան
Խումբ
Խումբ Shopify Amazon ACoS % պլանին Շահույթ

Ինչ կտրվածքներ կան

Ամբողջ աղյուսակը վարվում է slicer-ներով՝ սեղմեք խանութ կամ բրենդ, և ամեն ցուցանիշ ֆիլտրվում է վայրկյանի կոտորակում՝

ՉափումՈւմ է օգնում
Ալիք · Shopify / Amazon / ՄեծածախԲոլոր դերերը
Խանութ · [Խանութ A] / B / CՍեփականատեր, fulfillment-ի պատասխանատու
Բրենդ · ապրանքախումբՎաճառք, գնումներ
Կատեգորիա · ըստ ապրանքատեսակիԿատեգորիայի մենեջեր, գնումներ
Կատեգորիայի պատասխանատու · ըստ ալիքիՍեփականատեր
Ժամանակ · օր / ամիս / սեփականԲոլոր դերերը
Օգտակար համադրություն՝ ընտրեք բրենդ → անմիջապես տեսեք դրա ACoS-ը Shopify-ում vs Amazon-ում, պլանի կատարումը հատերով և մնացորդը բոլոր պահեստներով հենց հիմա։ Այդ պատկերը նախկինում հավաքվում էր երեք առանձին աղյուսակից։

Մնացորդը՝ միշտ վաճառքի կողքին

«Միջին օրական մնացորդը» համախմբում է գլխավոր պահեստը, Shopify-ի fulfillment-ը, Amazon FBA-ն, fulfillment գնացող ապրանքները և մեծածախ պահեստը։ Եթե վաճառքն աճում է, բայց մնացորդն ընկնում է 30%-ով, fulfillment-ի պատասխանատուն դա անմիջապես տեսնում է՝ նույն էկրանին, առանց առանձին ֆայլի։

Պրակտիկայից։ Բրենդի պլանը վերլուծելիս կարող եք միանգամից նայել պատվերները (Shopify), ընթացիկ պահեստի մնացորդը և ժամանակահատվածի գովազդի ծախսը։ Անմիջապես պարզ է՝ պլանը բաց թողնվեց «գովազդ չկար»-ի՞, թե՞ «մնացորդ չկար»-ի պատճառով։

Ինչպես է թարմացվում տվյալը

Shopify / Amazon APIավտոմատ, գիշերը
ClickHouseկենտրոնական պահոց
Excel՝ «Թարմացնել»~3–4 րոպե
Ամեն թերթ թարմ էմեկ անցումով

Օգտատերը սեղմում է մեկ կոճակ։ Ոչ մի գաղտնաբառ կամ բանալի մուտքագրելու կարիք չկա՝ դրանք ապրում են ֆայլի ներսում՝ սպասարկող թերթում, ամեն ինչ՝ մեկ անգամ կարգավորված։

Պլանների կառավարում՝ առցանց աղյուսակում

Պլանի թվերն ապրում են Google Drive-ի վրա առցանց աղյուսակում։ Կառուցվածքը պարզ է՝ ամեն տող է ապրանքի կոդ × ամիս × ալիք × տեսակ (հատ կամ ֏)։ Ուզում եք ճշտել պլա՞նը։ Բացեք աղյուսակը, փոխեք թվերը։ Հաջորդ թարմացման ժամանակ դրանք ինքնաշխատ ներքաշվում են. Power Query-ն ներբեռնում է ընթացիկ XLSX-ը, և ամեն ինչ հոսում է մոդել՝ «% պլանին», կուտակային պլան, համեմատում փաստի հետ։

Առցանց աղյուսակթիմը խմբագրում է միասին
Google DriveXLSX՝ հղումով
«Թարմացնել»Excel-ում
Մոդելը վերահաշվարկոչինչ ձեռքով

Հարկեր և վճարներ՝ մեկ թերթ, ամեն ինչ վերահաշվարկվում է

Ամեն խանութ ունի իր հարկային ու վճարային պրոֆիլը։ Դրույքներն ապրում են «Խանութներ» թերթի աղյուսակում՝ հենց ֆայլում։ Պրոֆիլը փոխվում է՝ փոխեք դրույքը մեկ բջջում, սեղմեք «Թարմացնել»։ 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-ներում։

Ճարտարապետություն

Տվյալների աղբյուրներ
Պահոց
Excel-մոդել
Shopify APIպատվերներ · ձագար · մնացորդ · գովազդ · fulfillment
Amazon SP-APIգործարքներ · անալիտիկա · օրական մնացորդ · գովազդ
OMS REST APIմնացորդ · մուտքեր · ինքնարժեք · գներ · մեծածախ առաքումներ
Google Driveպլաններ՝ SKU × ալիք × ամիս · XLSX հղումով
Ֆայլի թերթերԽանութներ · Օրացուցային սանդղակ · CH-աղբյուրների փնտրում
ClickHouse SQL-պատկերներ՝ ըստ խանութի Python-սկրիպտը բեռնում է
Shopify/Amazon/OMS API-ները
OMS-առաքումները, Drive-պլանները և ֆայլի թերթերը
գնում են ուղիղ Power Query
Power Query 42 հարցում · fnCH · fnOMS · GD_Excel_Workbook
Power Pivot ~30 մոդելի աղյուսակ · 296 DAX-չափիչ

Ալիքների տվյալները 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]"}
})
Ինչո՞ւ ոչ ODBC։ ClickHouse-ը CSV է մատուցում HTTP-ով՝ դա աշխատում է առանց ամեն աշխատատեղում դրայվեր տեղադրելու։ Թույլատրեք 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-ից քաշվում են երկու ճանապարհով՝

Power Pivot-ի տվյալների մոդելը

Մոդելը դասական աստղ է։ Կենտրոնական փնտրումները («մեկ» կողմը) ֆիլտրում են ամեն փաստ-աղյուսակ («շատ» կողմը)՝

ՓնտրումՆպատակ
Dim_ProductsSKU-ների միասնական կատալոգ՝ բրենդ, կատեգորիա, պատասխանատուներ, հարկային դաս
Dim_StoresՀարկ/վճար դրույքներ և պարամետրեր՝ ըստ խանութի
Dim_CalendarԱմսաթվի հիերարխիա՝ օր → ամիս → եռամսյակ → տարի
Dim_ChannelShopify / Amazon / Մեծածախ
Shopify productsvariant ID՝ SKU, բրենդ, կատեգորիա, խանութ
Amazon catalogASIN / SKU՝ վերնագիր, մարքեթինգային գին

Հիմնական փաստ-աղյուսակները՝ Shopify_Sales (~650հզ տող), Amazon_Transactions (~500հզ տող), ձագարի ագրեգատներ, գովազդի վիճակագրություն, օրական մնացորդ։

Ակտիվ vs ոչ-ակտիվ կապեր։ 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
Առաջին զանգից մինչ աշխատող ամփոփում՝ մոտ 2.5 ամիս։ Ֆայլն այժմ թարմացվում է ամեն օր և թիմի համար տվյալների միակ աղբյուրն է։ Ժամանակի մեծ մասը գնաց ոչ թե DAX-ին, այլ ClickHouse-ում SQL-պատկերների կառուցմանը՝ ETL-խողովակը հավաքվեց ըստ խանութի՝ հաշվի առնելով ամեն կաբինետի արտահանումների առանձնահատկությունները։

Նմա՞ն խնդիր ունեք ձեր կողմում

Պատմեք՝ 30 րոպեում կպարզենք, թե ինչն է հնարավոր։

դիտման ռեժիմ