Temat: Użycie funkcjonalności zewnętrznego serwera do danych...
Przemysław Kantyka:
Bycie pewnym siebie to dobra cecha, o ile faktycznie ma się rację i nie przekracza się granicy:
a) Zakładając, że dane mamy wstawione do zakresu A1:E7 sortujemy je po pierwszej kolumnie. Poniżej podaję wartości formuł do wstawienia:
w komórce A1: =A2
w komórce F2: =JEŻELI(A2=A1;F1&JEŻELI(F1<>"";F1&",";"")&B2&","&C2&","&D2&","&E2;B2&","&C2&","&D2&","&E2)
Formułę przeciągamy do końca zestawu danych - komórki F7
Formuła ta wstawia do komórki wiersz poprzedni i bieżący pod warunkiem, że cały czas jesteśmy w tej samej "grupie" ID.
w komórce G2: JEŻELI(A2<>A3;F2;"")
Formułę przeciągamy do końca zestawu danych - komórki G7
Formuła ta wstawia do komórki wartość "posumowanego" tekstu na granicy grup ID, oraz wartość pustą w środku "grupy".
"Jak Pan się zapewne domyśla, podpuszczam Pana, bo ja wiem, że nie da się tego zrobić ani formułami, ani funkcją VBA, bo ani formuły, ani funkcje VBA nie mają możliwości zmniejszenia ilości wierszy wyniku względem danych źródłowych." - no to proszę - definiujemy standardowy filtr danych i wywalamy te wiersze dla których wartość w kolumnie G jest niepusta.
Efekt do pobrania z http://blog.dataconsulting.pl/wp-content/uploads/2012/... Można sobie ładnie wynik np. skopiować.
Niech się Pan nie gniewa...
...ale, czy to żart?
Zrobił Pan rozwiązanie:
1. Bardzo SKOMPLIKOWANE
Wykopiowuję formułki z Pana arkusza tylko dla tylu wierszy, ile było w przykładzie. Dla 1.000 wierszy, proponuje Pan wpisać w arkusz 2.000 funkcji. Niezła efektywność i prostota ;).
=A2 F1 F2 F3 F4 c c1 c2 c3 c4 =JEŻELI(A2=A1;F1&JEŻELI(F1<>"";F1&",";"")&B2&","&C2&","&D2&","&E2;B2&","&C2&","&D2&","&E2) =JEŻELI(A2<>A3;F2;"")
b b1 b2 b3 b4 =JEŻELI(A3=A2;F2&JEŻELI(F2<>"";F2&",";"")&B3&","&C3&","&D3&","&E3;B3&","&C3&","&D3&","&E3) =JEŻELI(A3<>A4;F3;"")
b b5 b6 b7 b8 =JEŻELI(A4=A3;F3&JEŻELI(F3<>"";F3&",";"")&B4&","&C4&","&D4&","&E4;B4&","&C4&","&D4&","&E4) =JEŻELI(A4<>A5;F4;"")
a a1 a2 a3 a4 =JEŻELI(A5=A4;F4&JEŻELI(F4<>"";F4&",";"")&B5&","&C5&","&D5&","&E5;B5&","&C5&","&D5&","&E5) =JEŻELI(A5<>A6;F5;"")
a a5 a6 a7 a8 =JEŻELI(A6=A5;F5&JEŻELI(F5<>"";F5&",";"")&B6&","&C6&","&D6&","&E6;B6&","&C6&","&D6&","&E6) =JEŻELI(A6<>A7;F6;"")
a a9 a10 a11 a12 =JEŻELI(A7=A6;F6&JEŻELI(F6<>"";F6&",";"")&B7&","&C7&","&D7&","&E7;B7&","&C7&","&D7&","&E7) =JEŻELI(A7<>A8;F7;"")
Ale Pan pojechał... Funkcja JEŻELI() rządzi. I będzie się baaaardzo długo liczyć.
2. OGRANICZONE ilością wierszy Excela
3. WYMAGAJĄCE każdorazowego użycia autofiltra
b) "ani funkcje VBA nie mają możliwości zmniejszenia ilości wierszy wyniku względem danych źródłowych' - a funkcje otrzymujące w argumencie zakres danych (Range) + zwracające tablice?
"Nieprawda. Wiem, że w jakimś tam DODATKU do Oracle'a też jest podobna funkcja WM_CONCAT (podaję za przykładem z grupy Oracle'owej), ale w MS JET SQL na pewno nie ma (Jeżeli się jednak mylę, to proszę, żeby ktoś mnie naprostował!)" - z całym szacunkiem ale na MS JET SQL świat się nie kończy (osobiście nie specjalizuję się w tym dialekcie). Ale w innych bazach niż MySQL:
- Oracle: WM_CONCAT jest i owszem, ale jest też LISTAGG oraz kilka innych metod uzyskania tego wyniku - do poczytania na http://blog.dataconsulting.pl/2012/03/implementacja-li...
OK. Przecież napisałem, że Oracle ma. Też przyjmuję na wiarę. Ale TO PAN napisał, że nie jest wspierana, takie tam...
- MS SQL Server pozwala uzyskać ten wynik poprzez FOR XML: http://stackoverflow.com/questions/1621747/concat-fiel...
SELECT
SUBSTRING(buzz, 2, 2000000000)
FROM
(
SELECT
firstname
FROM
employee
WHERE
State = 'CA'
FOR XML PATH (',')
) fizz(buzz)
Tego nie rozumiem, ale sprawdzę. Nie znałem, więc, jeśli zadziała, punkcik dla Pana Szanownego.
- PostgreSQL: Wprost dostępna funkcja string_agg
Tu - być może. Nie znam na tyle PostgreSQL, przyjmuję na wiarę i kiedyś sprawdzę.
Reasumując
1. Rozwiązanie Excelowe - zrobione dla 7 wierszy mojego przykładu, ale, że tak powiem bardzo nieelegancko. Ponieważ jednak wymaga każdorazowej ingerencji użytkownika w proces - 0 punktów
2. Rozwiązania VBA się nie (jeszcze) doczekaliśmy
3. ad mojej uwagi, że tylko MySQL - ok., sprawdzę, na razie punkt dla Pana, bo nie znam w tej chwili odpowiedzi. Na pewno jednak nie zadziała ani w Excelu, ani w Accessie.
Ale, nawet gdyby zadziałało, przyjmijmy nawet, że tak jest!... to w niczym to nie umniejsza sensu mojego przykładu. Mając dane w Excelku, WARTO, wysłać je do innej bazy, by zrobić takie agregacje.
No to 1:1. :)
Czekam na rozwiązanie viżualbejzikowe.
P.S.
Ad rozwiązania excelowego:
Przy nieposortowanej tablicy, oczom mym ukazała się taka kaszanka
c F1 F2 F3 F4 c c1 c2 c3 c4 c1,c2,c3,c4 c1,c2,c3,c4
a a5 a6 a7 a8 a5,a6,a7,a8 a5,a6,a7,a8
b b1 b2 b3 b4 b1,b2,b3,b4 b1,b2,b3,b4
b b5 b6 b7 b8 b1,b2,b3,b4b1,b2,b3,b4,b5,b6,b7,b8 b1,b2,b3,b4b1,b2,b3,b4,b5,b6,b7,b8
a a1 a2 a3 a4 a1,a2,a3,a4 a1,a2,a3,a4
a a9 a10 a11 a12 a1,a2,a3,a4a1,a2,a3,a4,a9,a10,a11,a12 a1,a2,a3,a4a1,a2,a3,a4,a9,a10,a11,a12
Wię, jednym słowem, każe Pan użytkownikowi najpierw posortować, potem wpisać funkcje, potem użyć autofiltra. Automatyzacja, że hej!
Wojciech Gardziński edytował(a) ten post dnia 05.03.12 o godzinie 21:06