Wypowiedzi
-
Ok... danych może być wiele.
Skupię się na jednym kliencie. Kupował po kolei:
A
A
B
A
A
A
A
C
A
B
B
B
A
Ile razy maksymalnie kupił A zanim B? Spodziewać się chcę odpowiedzi 5 *a nie 4 jak wcześniej napisałam). (nie ważne, że wcześniej kupił B po 2xA, później aż 4 razy kupił A)
Ile razy kupił inne niż B? 6 (A przleplecione z C)
Więc nie o MIN() chodzi, bo nie o pierwsze B pytam, tylko o najdłuższy ciąg.
Znowu namieszałam? :)
Kursor - tak. Ale czy selectem by się dało? :)Edyta Ratajczyk edytował(a) ten post dnia 09.01.08 o godzinie 12:03 -
danego zjawiska.
A teraz do rzeczy. W tabeli mam zapisane daty zakupu danego produktu przez klientów.
ID ID_KLIENTA PRODUKT DATA_ZAKUPU
1 1 A 2007-01-01
2 2 A 2007-01-01
3 3 B 2007-01-01
4 1 A 2007-01-01
5 1 B 2007-01-01
6 1 A 2007-01-01
7 2 C 2007-01-01
8 1 A 2007-01-01
9 2 A 2007-01-01
Interesuje mnie np. ile razy (maksymalnie) klient zakupił produkt "A", zanim zdecydował się na inny.
(dla powyższego przykładu - klient 1 kupił A 3 razy, zanim wziął B)
Oczywiście zapytania mogą być różne - ile razy kupował inne (nie koniecznie tylko A) zanim wziął B itd.
Nie wiem, czy to na relacyjnej się da, czy podchodzi już bardziej pod hurtownię danych. (danych nie jest mało, ale nie jest też gigantycznie wiele)
Czy macie pomysł na zapytanie?
Pozdrawiam -
Ja już ponad miesiąc jak zostawiam moją córcię (obecnie 7 miesięcy) w domu z babcią. Już się przyzwyczaiłam do rozłąki, jeżdżę do pracy na 7.00 by wcześniej być w domu. (do pray dojeżdżam godzinę).
Nie wiem, jak będzie później. Na razie da się wytrzymać. -
Też właśnie nie mam sumienia budzić. Czasem sama się obudzi - jeżeli jest jeszcze czas - karmię ją, przytulam i dopiero wychodzę. Jednak zdecydowanie częściej śpi - nie budzę.
Domyślam się, że te "rady ekspertów" dotyczą sytuacji, gdy dziecko nie śpi. Wtedy jak najbardziej jestem "za" by podchodzić i wyjaśniać dziecięciu gdzie się idzie i kiedy będzie się z powrotem.
Dziękuję za wszystkie odpowiedzi.
Pozdrawiam -
Karolina Maćkowiak:
zdecydowanie nie wolno uciekać "cichaczem", dziecko musi byc swiadome tego co się dzieje,
Zapytam ponownie - czy uważacie, że powinnam budzić córkę (jak wychodzę, zazwyczaj śpi)? I mówić że wychodzę? Nie spodziewam się konkretnego TAK lub NIE, ale jak Wy postępujecie, gdy dziecię jeszcze śpi? -
Obeszłam.
Stwierdziliśmy, że 2005 i 2000 zachowują się inaczej ;)
Można zamknąć wątek.
Dziękuję wszystkim za zaangażowanie w próbę odpowiedzi i pozdrawiam.
PS. Jacka przepraszam - mam serwer 2000 a nie 2005 jak mylnie napisałam. -
Aby mieć możliwość przeczytania tego posta musisz być członkiem grupy EXCEL w praktyce
-
Robert Żwirski:
nie wiem czemu upierasz sie na "select *" , przeciez tworza tablicę #TempTable masz specyfikację kolumn, możesz potem uzyc je w selekcie
No przecież napisałam, że w pivocie już obeszłam...
Co nie zmienia faktu, że przedmiotowa porcedura wywala błąd. :)
I teraz toczy się dyskusja czemu jest błąd/nie błąd :)
Wiecie co? Problem nie w insercie i dropie...
Właśnie na tym selekcie się wykłada. :)
Ale czemu? Wciąż nie wiem. Kurcze, selecta o to nie podejrzewałam.
Zaremowany select pozwala mi na bezbłędne wykonanie czy skryptu, czy procedury :D
Może to faktycznie serwer (też 2000)
To by wyjaśniało, czemu się nie możemy dogadać :D
No to teraz proszę powiedzieć, czemu tak :)Edyta Ratajczyk edytował(a) ten post dnia 07.12.07 o godzinie 12:33 -
Aby mieć możliwość przeczytania tego posta musisz być członkiem grupy EXCEL w praktyce
-
Aby mieć możliwość przeczytania tego posta musisz być członkiem grupy EXCEL w praktyce
-
Aby mieć możliwość przeczytania tego posta musisz być członkiem grupy EXCEL w praktyce
-
:) Ja otwierałam wątek.
Jak byś nie zauważył - obeszłam problem, ale zacytuję samą siebie:
"Co nie zmienia istoty problemu (już tak dla podrążenia) czemu przedstawiony wcześniej problem się tak zachowuje (nie widzi kolumny... )"
Dobra, czepiam się, ale spokojnie, bez emocji (zwłaszcza niepotrzebnych)
A teraz odpowiedź właściwa.
Jacek Gużewski:
Po pierwsze. Nie chcę wyjść na zarozumialca, ale się mylicie W jednej sesji (jednym otwartym oknie z query) wykonuje następujące czynności:
1. Drop'uje procedure (jeśli istnije)
drop procedure tmp_dropTemporary
2. Dropuje tablice tymczasową (jeśli istnieje)
drop table #TempTable
3. Zakładam procedurę:
create procedure tmp_dropTemporary
as
create table #TempTable(
id_osoby decimal(9),
nazwisko nvarchar(100))
insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
alter table #TempTable drop column id_osoby
select * from #TempTable
4. Wykonuję procedurę:
Exec tmp_dropTemporary
Otrzymuje jeden rekord z jednym polem
To się nie dogadamy. Bo u mnie już tu jest błąd.
Nie otrzymuję jednego rekordu z jednym polem. Przykrość.
Nie wiem, czy faktycznie zapuszczałeś to co napisałeś i działa, czy zgadujesz - bo wg mnie (na logikę) to też powinno działać, czy może to kwestia serwera (u mnie 2005). Zastanawia mnie, czemu w takim razie mimo utworzonej tabeli #Temp ze skryptu działa create z procedur - jeżeli z Twojego opisu wnioskuję, że tabela tworzona w procedurze (pkt 4, 6 ,8 ...) i tabela utworzona w sesji poza procedurą (pkt 5) to te same obiekty albo przynajmniej mocno związane (po usunięciu kolumny z tabeli "zewnętrznej" przestaje działać procedura).
Ja rozumiem o czym piszesz, jednak w moich próbach wykonania tego co napisałeś problemem jest to, że U MNIE NIE DZIAŁA TAK, JAK TY TO OPISAŁEŚ (może to tylko mój problem, jakieś ustawienia albo co?).
I próbuję dociec czemu.
Może ktoś inny rozsądzi. Wg mnie:
Tabele tworzone w procedurze są widoczne TYLKO wewnątrz niej (jakby otwierały kolejną sesję).
Po zakończeniu procedury znikają - przynajmniej u mnie, po procedurze nie ma śladu po tych tabelach - w odróżnieniu od skryptowych, które są widoczne do czasu zakończenia sesji.
Dlatego mimo utworzenia tabeli (pkt 5) można bez komunikatów o błędzie informującym, że taka tabela istnieje bezkarnie odpalać dowolną ilość razy procedurę...
Optymalizator jednak przestawia operacje (czemu - nie wiem).
Może to, że u Ciebie działa a u mnie nie - to kwestia ustawień systemowych albo co? Nie wiem...
Moja teoria jak to działa wg mnie już została przedstawiona.
Ponieważ u Ciebie działa a u mnie nie - nasza dalsza dysputa nie ma sensu.
Mirek i Robert zdają się rozumieć opisywany przeze mnie problem - być może mają takie same objawy :)
Pozdrawiam -
Jacek Gużewski:
Robert Żwirski:
Komunikat który przedstawiłaś oznacza, że tabela jest już utworzona i kolumna jest już usunięta.
ale w tymm wypadku komunikat powinien już wystąpić przy operacji "create table" . W sumie na końcu tej procedury mozna jeszcze dorzucic "drop table", tak dla pewności
Nie tu jest pies pogrzebany. I na pewno nie ma tu znacznia kolejkowanie procedur w kompilatorze. Dla udowodnienia tego zróbcie taki skrypt:
create procedure tmp_dropTemporary1
as
create table #TempTable1(
id_osoby decimal(9),
nazwisko nvarchar(100))
insert into #TempTable1 (id_osoby, nazwisko,imie) values (1,'ada','ada')
alter table #TempTable1 drop column id_osoby
select * from #TempTable1
Założenie takiej procedury wykona się prawidłowo. Zaś jej działanie niestety nie. Ilość pól w create jest inna niż w insert.
Kompilator, jeśli obiekt nie jest utworzony fizycznie w czasie kompilacji procedury, nie sprawdza poprawności obiektów, tylko poprawność składni. Jeśli zaś obiekt istnieje fizycznie w tej sesji, to dodatkowo sprawdza poprawność struktur. I stąd błąd :
Server: Msg 207, Level 16, State 1, Procedure tmp_dropTemporary, Line 9
Invalid column name 'id_osoby'.Jacek Gużewski edytował(a) ten post dnia 06.12.07 o godzinie 13:18
Powtarzam. Polecenia z tej procedury odpalane pojedyńczo wykonywały się. Więc niby wsio ok. W Twoim przykładzie pojedyńczo też by się wyjechało, a komunikat jaki widzisz dotyczy nie kolumny imie, tylko wciąż id_osoba. :/
Tak więc Pozostaję przy moim. Kompilator/optymalizator przestawia... That's all. :)
PS. Czemu mam wrażenie, że piszemy o różnych rzeczach? ;) -
Jako skrypt (nie procedura) też mi nie hula - taki sam komunikat - już też o tym napisałam.
Odpalenie poleceń po kolei - wszystko OK.
Drop w oryginalnej procedurze był, jak nie ma też hula - tabela #Temp powołana wewnątrz procedury istnieje wyłącznie do czasu jej zakończenia.
Najbardziej mi pasuje jednak, że kompilator procedury faktycznie szereguje polecenia i w efekcie procedura nie wykonuje się tak, jak mi się wydaje a tak (zaznaczona zamiana kolejności poleceń):
create table #TempTable(
id_osoby decimal(9),
nazwisko nvarchar(100))
>>alter table #TempTable drop column id_osoby
>>insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
select * from #TempTable
Co po wywołaniu polecenia po poleceniu daje taki sam komunikat błędu (w tym przypadku mnie zupełnie nie dziwi) ;) -
:) Pisałam w innym wątku - to jest ta "dynamiczna tabela"
W oryginalnej - nie wiem ani ile, ani jakie nazwy mają kolumny :)
W przykładach to wygląda troszkę śmiesznie, ale chodzi o przedstawienie problemu :)
Boooo... hmmm... też pivot? O raju.. ale faktycznie będzie ładniej. :)
No pewnie że tak i ładnie i bez dodatkowych kursorów:)
Co nie zmienia istoty problemu (już tak dla podrążenia) czemu przedstawiony wcześniej problem się tak zachowuje (nie widzi kolumny... )
Z tego co udało mi się dowiedzieć (dziękuję Bartku), w trakcie kompilacji szeregowane są polecenia create, alter, insert, select.
Może procedura usuwa wcześniej kolumnę, do której później chce wstawić insertem?
Jednak nie zadziałało również zamknięcie dropa w oddzielnej procedurze odpalonej wewnętrznie (a to już chyba powinno zadziałać)
Pozostawiam do przemyślenia - nie dało się przeskoczyć, to obeszliśmy, ale jakby ktoś znał rozwiązanie - nie krępujcie się.Edyta Ratajczyk edytował(a) ten post dnia 06.12.07 o godzinie 12:05 -
Tabelę tworzę jak widać wewnątrz procedury więc musi istnieć. W tej samej procedurze jest insert i drop.
Tabela jest widoczna przez całe trwanie procedury (znika po skończeniu działania proc) więc i drop powinien ją widzieć. (Tym bardziej, że sam drop - bez inserta wcześniejszego - działa).
Co więcej dopisanie w procedurze
select * into #TempTable2 from #TempTable
alter table #TempTable2 drop column id_osoby
Działa...
Dla mnie to mały koszmarek...
Na razie w ten sposób obejdę.
Gdyby jednak ktoś znał ładniejszy - działający sposób będę wdzięczna. -
create procedure tmp_dropTemporary
as
create table #TempTable(
id_osoby decimal(9),
nazwisko nvarchar(100))
insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
alter table #TempTable drop column id_osoby
select * from #TempTable
odpalam procedurę
Exec tmp_dropTemporary
w odpowiedzi mam:
(1 row(s) affected)
Server: Msg 207, Level 16, State 1, Procedure tmp_dropTemporary, Line 9
Invalid column name 'id_osoby'.
Ke, Why, dlaczego? :)
Odpalanie poza procedurą poszczególnych poleceń działa.
Odpalenie wszystkich razem - nie.
Siwieję...
Help. -
Ewelina Chmielewska:
>Nigdy nie uciekalam niezauwazona, przeczytalam w jakiejs gazecie, >ze to najgorsze rozwiazanie, bo potem dziecko sie panicznie sie
>boi, ze mama nagle zniknie. Wolalam jak mi pomachala i nawet jak
>plakala to widziala, ze mnie juz nie ma w domu.)
no to koszmar... Ja wychodzę z domu o 6.00 - na razie Niunia jest mała (pół roku) nie ma więc płaczu, ale najczęściej śpi jak wychodzę - to co? Budzić?
Boję się tego dnia, gdy zacznie tęsknić
Teraz córeczka zostaje pod opieką Babci. -
Witam.
Po rozwiązaniu problemu piszę jak :) Ku pamięci a i może komuś innemu się przyda... (będę się mniej więcej przykładem posługiwała, chociaż jak na niego patrzę, to nie do końca trafiony...
Stworzyłam tabelę tymczasową #pracownicy_projekty (nazwisko varchar(30))
Kursorem pobudowałam @sqle 'Alter table #pracownicy_projekty add ' + @nazwa_projektu + ' varchar(25)
Execute sp_executesql @sql
i dalej już wypełnianie danych.
Zaskoczeniem dla mnie było - dlatego tu piszę - że wrzucenie całego create table... do @sql i odpalenie spowodowało utworzenie tabeli ale widocznej TYLKO wewnątrz tego 'EXECUTE'.
Ponieważ nie chciałam całej procedury (która jest trochę bardziej skomplikowana niż przykład) zamykać w zmienną tekstową (a propos - ktoś wie jak obejść ograniczenie zmiennej powyżej 4000 znaków?) musiałam w ten sposób.
Zamieszałam? Hmmm... Ale może - jak ktoś się będzie zastanawiał, czemu nie działa
set @sql='create table przyklad'
execute sp_executesql @sql
select * from przyklad
to już wie :D
Pozdrawiam i dziękuję wszystkim raz jeszcze -
Dziękuję wszystkim. W poniedziałek będę próbowała dalej.
Pozdrawiam