Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 68462 Skopiuj do schowka Duplikowanie tabeli w locie (odwołanie cykliczne)
Autor Wiadomość
WicherTKD
Stały bywalec Excelforum


Pomógł: 19 razy
Posty: 446
Wysłany: 04-07-2020, 22:34   Duplikowanie tabeli w locie (odwołanie cykliczne)

Hej,

Potrzebowałbym odwołać się do tej samej tabeli której dotyczy zapytanie bez jej duplikowania niejako w locie. Niestety podczas próby dodania kolumny niestandardowej i odwołania się do samej siebie powoduje błąd odwołania cyklicznego.

Potrzebowałbym uzyskać taki efekt jak na załączniku po prawej stronie na podstawie tabeli z lewej strony. W tabeli mam informacje kto jaką osobę zaprosił, potrzebowałbym informacje o każdej osobie przez która została zaproszona przez konkretnego mentora. Na przykład osoba o numerach 2,3,4 zostały zaproszone przez osobę 1 co mówi nam wartość "user" w kolumnie meta_key. Po wyfiltrowaniu user o numerze 1 mam tę listę osób i chciałbym o każdej takiej osobie wydobyć resztę informacji. Czy jhest to wykonalne bez duplikowania tabeli tak jak ja to zrobiłem ?

pozdrawiam

przyklad.xlsx
Pobierz Plik ściągnięto 5 raz(y) 25.06 KB

_________________
Budżet w Excelu (BWE)
ID posta: 389387 Skopiuj do schowka
 
 
Bill Szysz 
Excel Expert


Wersja: Win Office 365
Pomógł: 886 razy
Posty: 3583
Wysłany: 05-07-2020, 00:14   

Nie jestem pewien czy dobrze Cię zrozumiałem - sprawdź czy ta poprawka kodu to to o co Ci chodzi.
Kod:
let
    Źródło = Excel.CurrentWorkbook(){[Name="user_meta"]}[Content],
    #"Zmieniono typ" = Table.TransformColumnTypes(Źródło,{{"ID", Int64.Type}, {"user_ID", Int64.Type}, {"meta_key", type text}, {"meta_value", type text}}),
    #"Przefiltrowano wiersze" = Table.SelectRows(#"Zmieniono typ", each ([meta_value] = "1")),
    #"Scalone zapytania" = Table.NestedJoin(#"Przefiltrowano wiersze", {"user_ID"}, #"Zmieniono typ",{"user_ID"}, "tmp", JoinKind.LeftOuter),
    #"Rozwinięty element user_meta (2)" = Table.ExpandTableColumn(#"Scalone zapytania", "tmp", {"meta_key", "meta_value"}, {"meta_key.1", "meta_value.1"})
in
    #"Rozwinięty element user_meta (2)"
_________________
Zlecenia, konsultacje, doradztwo i szkolenia z Power Query, Power BI i Excela - Raporty, Analizy, Projekty
Pozdrawiam, były szbill62 aktualnie Bill Szysz
ID posta: 389390 Skopiuj do schowka
 
 
DwaNiedźwiedzie 
Excel Expert



Wersja: Win Office 2010
Pomógł: 251 razy
Posty: 632
Wysłany: 07-07-2020, 15:20   

Dla szerszego zrozumienia może warto dopisać, że odwołać się cyklicznie do tego samego zapytania nie można (*), ale jak najbardziej w jego środku można łączyć ze sobą dowolne kroki (jak to zrobił Bill):

Kod:
let
    tabela = #table({"id"}, {{1}}),
    #"Zamieniono 2" = Table.ReplaceValue(tabela, 1, 2, Replacer.ReplaceValue, {"id"}),
    #"Zamieniono 3" = Table.ReplaceValue(tabela, 1, 3, Replacer.ReplaceValue, {"id"}),
    #"Dołączone zapytanie" = Table.Combine({tabela, #"Zamieniono 2", #"Zamieniono 3"})
in
    #"Dołączone zapytanie"


W pierwszym kroku tworzę tabelę z wartością 1, w drugim zamieniam tę wartość na 2, w trzecim na 3 (ale wciąż odnosząc się do podstawowej tabeli z kroku pierwszego, obie zamiany nie są ze sobą powiązane), a na koniec łączę wszystkie wyniki w jedną tabelę. Warto pamiętać, że każdy krok jest osobnym bytem, czyli niezależenie od pośrednich przekształceń zawsze można sięgnąć do czystego źródła z kroku pierwszego.


* - wyjątkiem jest tu funkcja, która może wywołać samą siebie, korzystając z symbolu @:

Kod:
let
    fun = (x as number) => if x > 2 then x else @fun(x + 1)
in
    fun(1)


Ta funkcja może nie pomoże nam odpowiedzieć na pytanie o życie, wszechświat i całą resztę, ale na pewno zobrazuje istotę rekurencji w PQ. Wywołuję ją z argumentem x=1, zatem warunek w "ifie" nie jest spełniony, więc funkcja przechodzi w tryb "else" i wywołuje samą siebie z iksem powiększonym o jeden. Dla dwójki znów warunek nie jest spełniony, więc funkcja kolejny raz wywołuje siebie ze zwiększonym argumentem - i tym razem mamy sukces (choć w dzisiejszych czasach mówienie, że nierówność jest sukcesem, jest chyba lekko ryzykowne ;): 3>2, więc cała funkcja zwraca nam właśnie tę trójkę.
ID posta: 389416 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe