Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  9 10 11 12 13 14 15 16 17   další » ... 37

Z toho, co jsi napsal, se dá jen hádat. Úplně obecně, vizuály v pbi občas nesnášejí míry, které obsahují SUMMARIZECOLUMNS.
Tady ta míra je na můj vkus dost překombinovaná. Moc mi to nedává smysl, ale datový model je tajný. Zkus najít jednodušší řešení.

Oddělovač tam je, pevná mezera (char(160)). Stačí si ho nabrat do schránky a vložit do Text do sloupců.

(Ale chybí v prvním řádku, tam ho někdo už přepsal)

Alfan napsal/a:

Já zkoušel to od elninoslov, ale to mi nefunguje.


Co znamená "nefunguje"?
Nic to nehlásí?
Načte to něco?
...

@veny

veny napsal/a:


vzorec:1
=ZLEVA(POLÍČKO("filename");NAJÍT("...


Pokud používáš POLÍČKO bez odkazu, tak je aktualizace této buňky dost nespolehlivá. Tj. dokud neotevřeš list s buňkou, tak drží starou hodnotu. elnino to má korektně.

nebo
=SUMA(ČETNOSTI($A$1:$A$10000;UNIQUE(A1:$A$10000)))/POČET(UNIQUE(A1:A10000))

vysvětlovat to nebudu.

2 mil. řádků není problém, pracuji běžně se 100 - 150 mil. řádků. Nesmí se ale prohlížet základní tabulka řádek po řádku, ...

Sloupec se dá rozdělit i v datovém modelu. Bude to jen náročnější na paměť.

Připomínám, že pokud chceš optimalizovat výpočet, pak je DAX studio prakticky jediná volba (ukáže plán výpočtu včetně časů, ...).

Vypadá to, že mícháš datové typy v power query a v SQL serveru a/nebo typ parametru funkce s typem vrácené hodnoty.

Dotaz na server je TEXT. Datový typ v sql databázi ovlivňuje syntaxi dotazu, tj. jestli osobní číslo je dotazu jako číslo nebo je obalené uvozovkami.

"hodnota" by v každém případě měla být textem.

Pokud je personalnumber v db číslo, pak něco takového:


Osobni_cislo_Rov = (XXA as number) =>

let
Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka2"]}[Content],

#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"Osobní číslo", Int64.Type}}),

OC = #"Změněný typ"{0}[Osobní číslo],

// Když se to převede na text tady, je to dál jednodušší,
// může se také případně ošetřit chybějící hodnota, ...

#"Osobní číslo" = Text.From(OC)
in
#"Osobní číslo",

hodnota = Osobni_cislo_Rov(1),
// co to v tomto kroku ukazuje - je do správně????

// tady se skládá text dotazu
where = "Where personalnumber = " & hodnota & " "
// co to vrací tady? - je to správně (hodnota, syntaxe sql dotazu)?

Z ukázek vůbec není jasné co děláš.

Pokud máš problém s tou anonymní funkcí, tak funkce se volá s parametrem XXA, který
a) musí být zadán
b) musí být číslo
c) nesmí být null
d) ve funkci není použit.

Nepředvedl jsi, jak funkci voláš.

K čemu to má sloužit víš jen ty sám.

1. skládáš sql dotaz, tj. textový řetězec.
2. když si dotaz (vhodně upravíš a) odkrokuješ, můžeš se podívat co serveru posíláš
3. Celý dotaz v jednom kuse obvykle neskládám, rozdělím si to na vhodné kousky. Např. základní select (to co funguje) a where ... zvlášť. Manupulace s různými výběry je pak jednodušší.
4. Nejspíš bych skládal něco jako
"where personalnumber = '" & hodnota & "' "

Tak si to spočítej v kt a do výstupu si natáhni výsledek z kt (fce ZÍSKATKONTDATA).

Pro více sloupců a více hledaných hodnot ve sloupci:

Načtení filtrů

// Tabulka_filtr
let
Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka_filtr"]}[Content],
#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"A", type any}, {"B", type any}, {"C", type text}}),
#"Ošetření prázdného textu" = Table.ReplaceValue(#"Změněný typ","",null,Replacer.ReplaceValue,{"A", "B", "C"})
in
#"Ošetření prázdného textu"


Filtrování:


// Tabulka_data
let
Zdroj = Excel.CurrentWorkbook(){[Name="Tabulka1"]}[Content],
tabulka = Table.TransformColumnTypes(Zdroj,{{"A", Int64.Type}, {"B", type any}, {"C", type text}}),
FitrovaneSloupce = Table.ColumnNames(#"Tabulka_filtr"),
#"Filtrovano" = List.Accumulate(
FitrovaneSloupce,
tabulka, (x, s) =>
let
HodnotyFiltru = List.RemoveNulls(Table.Column(Tabulka_filtr,s)),
xxx = if List.Count(HodnotyFiltru) > 0 then
Table.SelectRows(x, each List.Contains(HodnotyFiltru, Record.Field(_, "" & s & "")))
else x
in
xxx
)
in
#"Filtrovano"


Hlavičky v tabulce filtrů (pokud chceme sloupec filtrovat) se musí shodovat s daty.

@Dingo
Dík za opravu, nechtělo se mi vymýšlet příklad ..., tak to bylo z hlavy.

Protože Hona se neobtěžuje poslat další informaci, tak jen pár poznámek:

Ošetření parametru na null případně prázdný řetězec je lepší provést při načtení parametru.

Pokud by se mělo testovat více hodnot v jednom sloupci, tak je nejspíš vhodné použít funkci List.Contains.

Pokud to má být filtr pro více sloupců, je samozřejmě možné zopakovat proceduru - vznikne něco...

Když potřebuju upravit víc sloupců v tabulce podle parametru, tak obvykle používám List.Accumulate (záleží na konkrétní potřebě).

Nebo třeba


// nevím co se načte z buňky
par = if ParametrBunky = null or ParametrBunky = "" then true else ParametrBunky,
// v každém případě filtrujeme
xxx = Table.SelectRows(#"tabulka", each [sloupec] = par)


nebo


// nevím co se načte z buňky
par = if ParametrBunky = null or ParametrBunky = "" then true else ParametrBunky,

// Pokud nechceme filtrovat, tak vracíme původní tabulku
xxx = if ParametrBunky
then #"tabulka"
else Table.SelectRows(#"tabulka", each [sloupec] = par)

Ten eralier pomalý není, jen 2000000x prohledáváš 2000000 x 3 položek. To chvíli trvá.

Možnosti:
a) skladovat v jednom sloupci datum a čas není zpravidla dobrý nápad. => rozděl datum a čas do různých sloupců, např. den a čas. Lépe se to zpracovává a ušetří se dost místa.

b) Pokud to máš rozdělené, vyrob tabulku kalendářních dat.
Můžeš automaticky, to ale vyrobí data od roku 01.01.1899. Pro začátek to stačí. Propoj relací den volání a date v generované tabulce.

Můžeš psát vzorečky. Ve vzorečku ponechávám generované názvy tabulky kalendářních dat.

Dopočítaný sloupec stejně nebude žádná sláva.
Neřeším více volání ve stejný den.

Var 1:
=CALCULATE(
COUNTA('Tabuľka1'[Value]); all('Tabuľka1');
'Tabuľka1'[Value]=earlier('Tabuľka1'[Value]);
DATESINPERIOD('Kalendář'[Date];'Tabuľka1'[Den];3;DAY))


Vzorec v tabulce vybírá řádky s datumem od data v řádku + 3 dny. tento výběr využívá relaci, je tedy o dost rychlejší než prohledání celé původní tabulky.

Počítá všechny výskyty, tj. opakování je, pokud výsledek je > 1.

Var 2:
=
var val = 'Tabuľka1'[Value] // místo earlier.. si zapamatuje co hledat
return
CALCULATE(
//--- vnitřní filtr - má vybrané řádky s datem, prohledá je a spočte počet výskytů
CALCULATE(
COUNTA('Tabuľka1'[Value]);
'Tabuľka1'[Value]=val
);
//--- Vnější filtr - pomocí relace vybere řádky s potřebným datem
all('Tabuľka1');
DATESINPERIOD('Kalendář'[Date];'Tabuľka1'[Den];3;DAY)
)


Pokud se by se počítaly i opakované hovory během dne budou výrazy trochu složitější. Základ je stejný + spočetly by se hovory během dne a pokud by jich bylo více než 1, tak by se zjistilo, kolik jich následuje.

Ps. Náhled na to, jak se vzorec zpracovává, poskytne DAX Studio

Mám problém, jak sem dostat soubor, tak aspoň nástřel postupu.

Řeší se to v datovém modelu. Podívejte se na schema modelu "hvězda" ("star"). Tady to není čistá hvězda, ale funguje to.

Příprava dat.

Data jsou fakta a dimenze. Tady jsem odvodil dimenze "LineName", "Vady". PQ kód následuje. Mělo by stačit ctrl-c, ctrl-v.

// Data_pro_gravy_množství_vyrobených__3
let
Zdroj = Excel.CurrentWorkbook(){[Name="Data_pro_gravy_množství_vyrobených__3"]}[Content],
#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"Line_name", type text}, {"Date", type datetime}, {"Year", Int64.Type}, {"CW", Int64.Type}, {"Produced_quantity", Int64.Type}})
in
#"Změněný typ"

// LineName
let
Zdroj = Excel.CurrentWorkbook(){[Name="Data_pro_gravy_množství_vyrobených__3"]}[Content],
#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"Line_name", type text}, {"Date", type datetime}, {"Year", Int64.Type}, {"CW", Int64.Type}, {"Produced_quantity", Int64.Type}}),
#"Odebrané ostatní sloupce" = Table.SelectColumns(#"Změněný typ",{"Line_name"}),
#"Odebrané duplicitní položky" = Table.Distinct(#"Odebrané ostatní sloupce"),
#"Seřazené řádky" = Table.Sort(#"Odebrané duplicitní položky",{{"Line_name", Order.Ascending}})
in
#"Seřazené řádky"

// Data_pro_grafy_zmetky_2021__7
let
Zdroj = Excel.CurrentWorkbook(){[Name="Data_pro_grafy_zmetky_2021__7"]}[Content],
#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"Datum", type datetime}, {"MNOZSTVI", Int64.Type}, {"Typ vady", Int64.Type}, {"Vada", type text}, {"LINKA", type text}, {"týden", type text}, {"Četnost", Int64.Type}, {"kumulovaný výsykt %", Int64.Type}})
in
#"Změněný typ"

// Vady
let
Zdroj = Excel.CurrentWorkbook(){[Name="Data_pro_grafy_zmetky_2021__7"]}[Content],
#"Změněný typ" = Table.TransformColumnTypes(Zdroj,{{"Datum", type datetime}, {"MNOZSTVI", Int64.Type}, {"Typ vady", Int64.Type}, {"Vada", type text}, {"LINKA", type text}, {"týden", type text}, {"Četnost", Int64.Type}, {"kumulovaný výsykt %", Int64.Type}}),
#"Odebrané ostatní sloupce" = Table.SelectColumns(#"Změněný typ",{"Typ vady", "Vada"}),
#"Odebrané duplicitní položky" = Table.Distinct(#"Odebrané ostatní sloupce", {"Typ vady"})
in
#"Odebrané duplicitní položky"


Data se načtou do datového modelu.

Pak tam máte kalendář. Nejrychlejší je v datovém modelu zvolit návrh/tabulka kalendářních dat/nová tabulka.

V datech máte týdny, tak klik na přidat sloupec a vzorec je =WEEKNUM('Calendar'[Date])

Dále v návrhu/zobrazit diagram a propojit rámečky - stačí tahat myší - datumy do kalendáře, linky do LineName, vady (pokud budou třeba...)

Vyrobí se míry:

Klik na sloupec Produced_quantity, v návrhu klik na autosum a dostanete míru:

Sum of Produced_quantity:=SUM([Produced_quantity])

Obdobně dostanete ve druhé tabulce

Sum of MNOZSTVI:=SUM([MNOZSTVI])

No a podíl:

Kliknete někam do volného prostoru pod tabulkou a napíšete

b3b16:=divide( [Sum of MNOZSTVI]; [Sum of Produced_quantity]) * 1000000


Stačí začít psát, tím skočíte do řádku vzorců. Když zadáte "[", program nabídne připravené míry.

A pak už na listu vložíte kont. tabulku.
Pamatujte. VŽDY do hlavičky sloupců a řádků dávejte položky z dimenzí, jinak to bude počítat podivně.


Strana:  1 ... « předchozí  9 10 11 12 13 14 15 16 17   další » ... 37

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Aktivní diskuse

Čas od do

lubo • 19.4. 16:30

Makro smyčka

MilanKop • 19.4. 10:46

Makro smyčka

elninoslov • 19.4. 9:02

Čas od do

elninoslov • 19.4. 8:46

Čas od do

jarek1111 • 18.4. 13:46

Čas od do

lubo • 18.4. 11:13

Čas od do

jarek1111 • 18.4. 8:32