Michał Stanuch

Sales Menager, Metro Group Poland, Real sp. z o.o.

Wypowiedzi

  • Michał Stanuch
    Wpis na grupie ACCESS w praktyce w temacie POMOCY: Grupowanie po kilka najwyższych wartości dla...
    23.02.2014, 09:27

    Wykombinowałem coś takiego w excelu dla innej tabeli:
    Najpierw sortowanie po grupa - jest wartością liczbową, później ilosc malejąco
    dodałem kolejną kolumnę (N) z:
    =JEŻELI(C2-C3=0;1;0) (i w dół) - w kolumnie C jest grupa zwraca 1 do czasu kiedy się nie zmieni wtedy 0
    w kolejnej kolumnie (O)
    =(O1+N2)*N2 (i w dół)
    dodaje do wartości poprzedniego wiersza 1 aż do momentu kiedy grupa się zmieni wtedy mnoży przez 0 i liczy od nowa filtr wybieram 1,2,3,4,5 i mam TOP5 ilości w każdej grupie.
    Działa i to całkiem nieźle nawet na ponad 20tys wierszy, alei tak potrzebuję to zrobić w accesie.

    Rozwiązanie:
    SELECT smd.grupa, smd.ilosc, smd.nazwa, "TOP " & DCount("*","smd","[ilosc] >" & Replace([ilosc],",",".") & " and grupa = " & [grupa])+1 AS top_ilosc
    FROM smd
    WHERE (((DCount("*","smd","[ilosc] >" & Replace([ilosc],",",".") & " and grupa = " & [grupa]))<=4))
    ORDER BY smd.grupa, "TOP " & DCount("*","smd","[ilosc] >" & Replace([ilosc],",",".") & " and grupa = " & [grupa])+1;

    dobrze działa przy małej ilości - usunąłem kilkanaście tys wierszy przy około 600 daje jeszcze wynik w normalnym czasie
    przy 7tys wierszy już trwa to długo ale daje wynik około 5min
    przy 9tys po 8min a baza ma około 60tys wierszy (po całej nocy nic..)

  • Michał Stanuch
    Wpis na grupie ACCESS w praktyce w temacie POMOCY: Grupowanie po kilka najwyższych wartości dla...
    22.02.2014, 19:20

    Wojciech M.:
    Jaki typ ma u Ciebie grupa?
    U mnie w testach grupa to była zmienna znakowa.
    Jeżeli u Ciebie grupa jest liczbą (podejrzewam autonumer) to zbędna staje się część związana z apostrofami.


    Drugim problemem jest przecinek w liczbie ułamkowej. Prawdopodobnie Access "wrzucił" wartość z przecinkiem do kodu, który wymaga kropki. (testowałem na liczbach całkowitych).

    Spróbuj jednego z dwóch rozwiązań,
    Dla grupy typu znakowego:


    select tblTABLICA.grupa,
    tblTABLICA.ilosc,
    tblTABLICA.nazwa,
    "TOP " & DCount("*","tblTABLICA","[ilosc] >" &replace ([ilosc],"," , ".") & " and grupa = '" & [grupa] & "'") + 1 as top_ilosc
    from tblTABLICA
    where DCount("*","tblTABLICA","[ilosc] >" &replace ([ilosc],"," , ".") & " and grupa = '" & [grupa] & "'")<=4;[/quote]> [quote]


    lub dla grupy typu liczbowego:


    select tblTABLICA.grupa,
    tblTABLICA.ilosc,
    tblTABLICA.nazwa,
    "TOP " & DCount("*","tblTABLICA","[ilosc] >" &replace ([ilosc],"," , ".") & " and grupa = " & [grupa] ) + 1 as top_ilosc
    from tblTABLICA
    where DCount("*","tblTABLICA","[ilosc] >" &replace ([ilosc],"," , ".") & " and grupa = " & [grupa] )<=4;[/quote]> [quote]


    (tym razem nie sprawdzałem na bazie - więc mogą być literówki)

    Działa bezbłędnie:
    SELECT smd.grupa, smd.ilosc, smd.nazwa, "TOP " & DCount("*","smd","[ilosc] >" & Replace([ilosc],",",".") & " and grupa = " & [grupa])+1 AS top_ilosc
    FROM smd
    WHERE (((DCount("*","smd","[ilosc] >" & Replace([ilosc],",",".") & " and grupa = " & [grupa]))<=4))
    ORDER BY smd.grupa, "TOP " & DCount("*","smd","[ilosc] >" & Replace([ilosc],",",".") & " and grupa = " & [grupa])+1;
    ale na małej bazie kilkanaście rekordów....
    na tej którą muszę przerobić nie widać postępu....

  • Michał Stanuch
    Wpis na grupie ACCESS w praktyce w temacie POMOCY: Grupowanie po kilka najwyższych wartości dla...
    20.02.2014, 20:34

    Wielkie dzięki za wskazówki ale
    Nie wiem dlaczego ale nie działa ........

    select smd.grupa,
    smd.ilosc,
    smd.nazwa,
    "TOP " & DCount("*","smd","[ilosc] >" & [ilosc] & " and grupa = '" & [grupa] & "'") + 1 as top_ilosc
    from smd
    where DCount("*","smd","[ilosc] >" & [ilosc] & " and grupa = '" & [grupa] & "'")<=4;
    Zwraca kilkukrotnie NIEODPOWIEDNI TYP DANYCH W WYRAŻENIU KRYTERIUM i później "Błąd skladniowy (przecinek) w wyrażeniu kwerendy `[ilosc]>163,87 and grupa =`52". "

    ?????????

    DRUGA

    SELECT grupa,ilosc,nazwa (SELECT Count(*)
    FROM smd As T1
    WHERE T1.ilosc<=smd.ilosc and smd.grupa=T1.grupa) AS LP, smd.nazwa, *
    FROM smd
    WHERE ((((SELECT Count(*)
    FROM smd As T1
    WHERE T1.ilosc<=smd.ilosc and smd.grupa=T1.grupa))<6))
    ORDER BY smd.ilosc DESC;

    Niby wykonuje kwerendę ale żadnych efektów nie dzieje się nic

    ?????????????????

  • Michał Stanuch
    Wpis na grupie ACCESS w praktyce w temacie POMOCY: Grupowanie po kilka najwyższych wartości dla...
    19.02.2014, 19:13

    Nie do końca rozumię.
    jakie 2 kwerendy?

    mam tabelę połączoną z excela o nazwie smd
    w tabeli jest kilka kolumn:
    grupa / nazwa / ilość / wartość
    wierszy jest ponad 90000
    potrzebuję z każdej grupy jest ich około 50 zrobić tabelę lub kwerendę która pokaże tylko 5 największych wartości dla każdej grupy. wiem najpierw przesortować potem użyć TOP tylko jak bo nic mi nie wychodzi........

  • Michał Stanuch
    Wpis na grupie ACCESS w praktyce w temacie POMOCY: Grupowanie po kilka najwyższych wartości dla...
    17.02.2014, 21:40

    Witam,
    Potrzebuję z tabeli wyciągnąć po 5największych wartości w każdej grupie

    Tabela ma pola:
    grupa, ilość, nazwa

    z każdej grupy potrzebuję uzyskać po 5 największych wartości
    tak żeby wyglądało to tak

    grupa1 / top1 ilość / nazwa
    grupa1 / top2 ilość / nazwa
    grupa1 / top3 ilość / nazwa
    grupa1 / top4 ilość / nazwa
    grupa1 / top5 ilość / nazwa
    grupa2 / top1 ilość / nazwa
    grupa2 / top2 ilość / nazwa
    grupa2 / top3 ilość / nazwa
    grupa2 / top4 ilość / nazwa
    grupa2 / top5 ilość / nazwa
    i tak dalej

    przeszukałem już wszystko i nic nie umiem znaleźć pomóżcie

Dołącz do GoldenLine

Oferty pracy

Sprawdź aktualne oferty pracy

Aplikuj w łatwy sposób

Aplikuj jednym kliknięciem

Wyślij zaproszenie do