Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][MySQL] Select COUNT(*)
Forum PHP.pl > Forum > Przedszkole
Spyder
Witam

Mam taki problem

  1. SELECT COUNT('value') FROM orders WHERE opid IN (SELECT DISTINCT opid FROM orders)


Ogulnie mam takie cos:

ID | OPID | VALUE |
1|AAA|20
2|AAA|20
3|ABA|45
4|ACA|44
5|ADA|56

Chce zeby kount podliczyl mi wszystkie wartosci ale jak jest w przypadku AAA jesli wystepuje rekord 2x to zeby bral wartosc pierwsza a ignorowal kolejne. Cos jak Group BY, albo UNIQUE

Dzieki
nospor
  1. ... count(DISTINCT nazwapola)...
erix
Cytat
Ogulnie mam takie cos:

Ogólnie, to nie łaska włączyć sprawdzania pisowni?

Cytat
Chce zeby kount podliczyl mi wszystkie wartosci ale jak jest w przypadku AAA jesli wystepuje rekord 2x to zeby bral wartosc pierwsza a ignorowal kolejne

AFAIK:
  1. SELECT DISTINCT
Spyder
Dzieki za odp ale po pierwsze sie domyslilem ze nie ma byc COUNT tylko SUM, a dodatkowo wartosci VALUE moga byc takie same ale dla innego OPID.

Czyli nie moze byc DISTICT na nazwe pola value bo bedzie mi bralo unikalne value:

poprawnie jest tak:

  1. SELECT SUM(value) FROM orders WHERE STATUS <> 'W'


Tyle ze teraz trzeba dodac gdzie wartosc opid jest unikalna i nie moze byc group by.
erix
Cytat
moga byc takie same ale dla innego OPID.

A tak po polsku, to co chcesz osiągnąć?
Spyder
To jeszcze raz jak mam np:


ID | OPID | VALUE
1|AAA|10
2|AAA|10
3|AAA|10
4|BBB|10
5|CCC|10
6|DDD|10
7|DDD|10

Przy moim zapytaniu pokaze mi 70 a ja chce zeby pokazalo mi 40...

Dzieki
erix
No to napisałem:
  1. SELECT DISTINCT
Spyder
Nie moge dac DISTINCT i SUM w jedym... Jak mam zapisac to zeby DISTINCT bylo na OPID a sumowalo value?questionmark.gifquestionmark.gif
erix
  1. SELECT sum(c2) FROM asd WHERE c3 IN(SELECT DISTINCT c3 FROM asd)
Spyder
To teraz tak jak kukniesz na poczatek tego postu to dokladnie tak mialem tyle ze z COUNT co odpisalem zeby zamienic na SUM czyli teraz mam to samo co bylo na poczatku tyle ze to nie dziala i zwraca mi ta sama wartosc sad.gif co bez DISTINCT


  1. SELECT SUM(value) FROM orders WHERE STATUS <> 'W' AND opid IN (SELECT DISTINCT opid FROM orders )


nie przejmuj sie statusem bo to dodatkowa zmienna nie majaca zwiazku z problemem
erix
Cytat
co odpisalem zeby zamienic na SUM czyli teraz mam to samo co bylo na poczatku tyle ze to nie dziala i zwraca mi ta sama wartosc

Fakt...

  1. SELECT sum(c2) FROM (SELECT c2 FROM asd GROUP BY c3) x
Spyder
  1. SELECT SUM(value) FROM orders WHERE STATUS <> 'W' AND opid IN (SELECT value FROM orders GROUP BY opid)


Jeszcze nie to bo wyswietla za mala wartosc...

Oki odezwe sie za 1h...

Jakies pomysly questionmark.gif?
erix
A zrobiłeś w ogóle, jak mówiłem? U mnie wyświetla poprawnie...
Spyder
Cytat(erix @ 21.08.2009, 19:18:06 ) *
A zrobiłeś w ogóle, jak mówiłem? U mnie wyświetla poprawnie...



pewnie ze zrobilem i testowalem tu jest zapytanie do phpMyadmina:

  1. SELECT sum(value) FROM test WHERE opid IN(SELECT value FROM test GROUP BY opid)


Tu jest baza:

  1. CREATE TABLE `test` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT,
  3. `opid` varchar(10) NOT NULL,
  4. `value` float NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
  7.  
  8. --
  9. -- Dumping data for table `test`
  10. --
  11.  
  12. INSERT INTO `test` (`id`, `opid`, `value`) VALUES (1, 'AAA', 10),
  13. (2, 'AAA', 10),
  14. (3, 'AAA', 10),
  15. (4, 'BBB', 10),
  16. (5, 'CCC', 10),
  17. (6, 'DDD', 10),
  18. (7, 'DDD', 10);

thek
Mam nadzieję, że to jest to, o co Ci chodzi winksmiley.jpg
  1. SELECT sum(value) FROM test WHERE id IN( SELECT min(id) FROM test GROUP BY opid)

Szukam najniższego id, spośród wszystkich z takim samym opid, a potem sumuję value z tak uzyskanych rekordów smile.gif Najlepiej zauważyć liczenie gdy zrobisz każdy rekord z inna wartością winksmiley.jpg
  1. CREATE TABLE `test` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `opid` varchar(3) NOT NULL,
  4. `value` int(3) NOT NULL,
  5. PRIMARY KEY (`id`),
  6. KEY `opid` (`opid`)
  7. )
  8.  
  9. INSERT INTO `test` (`id`, `opid`, `value`) VALUES
  10. (1, 'AAA', 10),
  11. (2, 'AAA', 15),
  12. (3, 'AAA', 20),
  13. (4, 'BBB', 25),
  14. (5, 'CCC', 30),
  15. (6, 'DDD', 35),
  16. (7, 'DDD', 40);

Sprawdź wtedy podzapytanie
  1. SELECT min(id) FROM test GROUP BY opid

a zobaczysz, że pokazuje zawsze rekord o najniższym id, czyli de facto ten, w którym ta wartość wystąpiła po raz pierwszy. W takim wypadku jak mój powyższy pokaże Ci rekordy 1, 4, 5, 6 i wyliczy sumę jako 100. A o ten właśnie chyba chodzi i taki być powinien bo 10+25+30+35 =100
Spyder
I tu masz mistrza dzieki wielkie bo meczylem sie juz troche winksmiley.jpg
thek
Nie ma sprawy... Czasem człowiek wpada w rutynę i sam tego doświadczam. Tu literówka, tam coś się zapomni i kłopot gotowy. Ja też nie jestem guru programowania, ale gdzie mogę to pomogę smile.gif Szkoda tylko, że tam gdzie ja już nie mogę to niewielu może mi pomóc biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.