Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Funkcja COUNT DISTINCT, Problem z zagnieżdżeniem
bini23
post 5.03.2007, 08:56:39
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 24.12.2006

Ostrzeżenie: (0%)
-----


Mam do napisania pewną kwerendę, mianowicie w pierwszym polu w tabeli mam wartość pola autonumerowanie onazwie ID, w następnej mam pole formatowane jako data krótka o nazwie Data, w trzeciej kolumnie pole reprezentujące wartość liczbową, które akurat w moim przypadku jest nakładem gazety o nazwie poprostu Naklad. Zdarza mi się, że drukuję gazetę dwa razy tego samego dnia z dwóch maszyn jednocześnie, powiedzmy mam do wydrukowania 100000 Faktu łącznie w danym dniu to drukuję 50000 na jednej i 50000 na drugiej maszynie, czyli mam dwa rekordy tego samego dnia dotyczące nakładu, czyli jeśli chcę obliczyć średni nakład faktu w miesiącu to dni w którym są dwa rekordy przekłamują mi tą średnią, gdyż nie interesuje mnie to ile dana maszyna wydrukowała gazet tylko ile w danym dniu gazet wydrukowano. Funkcją, która rozwiązuje mi ów problem jest zagnieżdżona funkcja COUNT DISTINCT , lecz niestety nie wiem dlaczego w accesie nie chcą ze sobą one współpracować w przeciwieństwie chociażby do PostgreSQL. Tak wygląda owa kwerenda , jeśli ktoś ma inny pomysł, albo potrafi wytłumaczyć dlaczego one nie działają to będę wdzięczny.

SELECT SUM(Fakt.Naklad)/COUNT(DISTINCT(Fakt.Data)) AS Sredni_Naklad
FROM Fakt;
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
spook
post 6.03.2007, 13:59:31
Post #2





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 1.12.2006
Skąd: Łowicz

Ostrzeżenie: (0%)
-----


Nie wiem czy do końca zrozumiałem Twój problem, ale spróbuj może tak:

SELECT Sum(Fakt.Naklad) AS SumaOfNaklad, Fakt.Data, Sum([Naklad])/Count([Data]) AS Srednia
FROM Fakt
GROUP BY Fakt.Data;
Go to the top of the page
+Quote Post
bini23
post 7.03.2007, 09:07:32
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 24.12.2006

Ostrzeżenie: (0%)
-----


Niestety nie mogę zrobić czegoś takiego jak:

SELECT Fakt.Data, Sum([Fakt.Naklad])/Count([Fakt.Data]) AS Srednia

,gdyż dat mam więcej niż jedna dziennie czyli np. tabela wygląda tak:

ID_____Data______Naklad

1____2007-01-01____2000
2____2007-01-01____3000
3____2007-01-02____5000


Chcę obliczyć średni nakład, który powinien wynieść 5000 sztuk czyli ma dodać 2000+3000+5000 i podzielić przez sumę unikatowych dni czyli dwa dni a nie trzy. Taka funkcja powinna załatwić sprawę Sum([Fakt.Naklad])/Count(Distinct([Fakt.Data])) AS Srednia

Niestety nie działa, dlatego zwracam sie do was jak można inaczej rozwiązać ten problem. Użycie funkcji Group by spowoduje, że zostanie wyświetlona średnia wartość w danym dniu, a ja chce średnią wartość we wszystkich dniach łącznie. Czyli nie chcę takiego wyniku działania kwerendy jak przedstawiony w odpowiedzi:

__Data______Naklad
2007-01-01___2500
2007-01-02___5000

Natomiast interesuje mnie jeden rekord wyświetlany przez kwerendę, reprezentujący średnią z wszystkich unikatowych dni. W tym przypadku: 5000

Wiem, ze jest to możliwe bo jak pisałem wyżej w PostgreSQL działa to bez problemu. sad.gif

Ten post edytował bini23 7.03.2007, 09:31:47
Go to the top of the page
+Quote Post
frickle
post 7.03.2007, 12:44:40
Post #4





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 20.04.2006
Skąd: Kraków/Lublin/Lubartów

Ostrzeżenie: (0%)
-----


A próbowałeś zagnieżdżonych zapytań? np:

  1. SELECT avg(naklad) FROM (SELECT sum(naklad) FROM fakt GROUP BY DATA)


tak z palca pisane, ale może zadziała.

wewnętrzne zapytanie wywali sumy nakladu dla poszczególnych dni a zewnętrzne obliczy średnią z wewnętrznego...

Ten post edytował frickle 7.03.2007, 12:45:03


--------------------
Lepiej kijek obcinkować niż go potem pogrubasić.
Go to the top of the page
+Quote Post
spook
post 7.03.2007, 14:39:31
Post #5





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 1.12.2006
Skąd: Łowicz

Ostrzeżenie: (0%)
-----


W takim razie może spróbuj zrobić dwie kwerendy:
1. Policz sumę nakładu wg dni:
SELECT DISTINCT Fakt.Data, Sum(Fakt.Naklad) AS SumaOfNaklad
FROM Fakt
GROUP BY Fakt.Data;
2. Na podstawie pierwszej licz średnią
SELECT Sum([SumaOfNaklad])/Count([Data]) AS Srednia
FROM [Fakt Kwerenda];
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 20:36