Avatar billede kristiankogut Nybegynder
05. juni 2010 - 22:29 Der er 9 kommentarer og
1 løsning

Optæl procent

Jeg har behov for et array der ser nogenlunde sådan ud:

Afdeling:        Antal nøgler, besvarelser, opnået procent
nr. 1                333          111        33%
nr. 2                444          111        25%

hvor
- "antal nøgler" er et COUNT(lastname)
- besvarelser fås ved denne querry pt.
    SELECT `lastname` FROM `TABEL` where `completed` NOT like 'n'
- og procenten skal så beregnes.



Og jeg har en tabel der er lignende dette: 
"lastname"      "completed"
BAGER      2010-06-01 14:24
BAGER     2010-06-01 14:50
BAGER     2010-06-02 11:51
BAGER     2010-06-02 14:53
BAGER     N
BAGER     N
BAGER     N
BAGER     N
LAGER  2010-06-01 10:59
LAGER     2010-06-01 11:09
LAGER     N
LAGER     2010-06-03 10:12
LAGER     N
LAGER     N
LAGER     N

obs.. DER ER OP TIL 19 FORSKELLIGE AFDELINGER..

Jeg har rodet med noget som dette :

SELECT count(`lastname`) from `TABEL` into @optalt;
Select count(`lastname`) where completed like 'n' AS gennemfoert, count(`lastname`) / (@optalt] AS percantage from `TABEL`

Men det er vist helt af helveds til...

hvordan gør man dette?
06. juni 2010 - 11:30 #1
Du fik ingen indlaeg.  Jeg vil heller ikke selv gaa i gang med at udarbejde og teste en loesning saa laenge langt de fleste af dine spoergsmaal staar aaben og jeg derfor maa forvente at du heller ikke vil lukke dette spoergsmaal.  Luk dine spoergsmaal, saa kan vi tales ved.
Avatar billede kristiankogut Nybegynder
06. juni 2010 - 13:47 #2
Hej Christian.

Det skal jeg absolut beklage.. Nogle af spørgsmålene, er så gamle at jeg ikke kan se dem mere. Derfor kan jeg ikke lukke alle sammen.
De resterende har jeg været inde og bede om et svar fra deltagerene, for self. skal de have points for det..

Jeg håber du vil kigge på dette spørgsmål, alligevel.

På forhånd mange tak.
06. juni 2010 - 16:44 #3
Ja, jeg kan se du er i gang med at lukke, saa jeg er i gang med at kikke paa dit spoergsmaal.  Jeg har for test lavet denne tabel: "CREATE TABLE kristiankogut(lastname VARCHAR(20), completed VARCHAR(20));" og foreloebigt lavet denne query der for hver "lastname" taeller antal "completed":  "SELECT COUNT(k1.lastname) AS Antal_noegler, (SELECT COUNT(*) FROM kristiankogut WHERE completed NOT LIKE 'N' AND lastname = k1.lastname GROUP BY lastname) As besvarelser, Antal_noegler/besvarelser FROM kristiankogut k1 GROUP BY k1.lastname".  Fra mine testdata, som jeg viser nedenfor, giver queryen dette resultat: 

Antal_noegler  besvarelser 
10 7
8 6

Nu kommer saa spoergsmaalet til dig:  hvor vil du have denne array?  Det at skrive "nr.1" og "33%" er egenlig en opgave for en applikation, ikke for sql.  Det vil for eksempel temmelig nemt kunne udskrives til en php-side.

Her er mine testdata:

INSERT INTO kristiankogut VALUES('BAGER', '2010-06-01 14:24');
INSERT INTO kristiankogut VALUES('BAGER', '2010-06-01 14:25');
INSERT INTO kristiankogut VALUES('BAGER', '2010-06-01 14:26');
INSERT INTO kristiankogut VALUES('BAGER', '2010-06-01 14:27');
INSERT INTO kristiankogut VALUES('BAGER', '2010-06-01 14:28');
INSERT INTO kristiankogut VALUES('BAGER', '2010-06-01 14:29');
INSERT INTO kristiankogut VALUES('BAGER', '2010-06-01 14:23');
INSERT INTO kristiankogut VALUES('BAGER', 'N');
INSERT INTO kristiankogut VALUES('BAGER', 'N');
INSERT INTO kristiankogut VALUES('BAGER', 'N');
INSERT INTO kristiankogut VALUES('LAGER', '2010-06-01 14:23');
INSERT INTO kristiankogut VALUES('LAGER', '2010-06-01 14:24');
INSERT INTO kristiankogut VALUES('LAGER', '2010-06-01 14:25');
INSERT INTO kristiankogut VALUES('LAGER', '2010-06-01 14:26');
INSERT INTO kristiankogut VALUES('LAGER', '2010-06-01 14:27');
INSERT INTO kristiankogut VALUES('LAGER', '2010-06-01 14:28');
INSERT INTO kristiankogut VALUES('LAGER', 'N');
INSERT INTO kristiankogut VALUES('LAGER', 'N');
Avatar billede kristiankogut Nybegynder
07. juni 2010 - 21:53 #4
Det ser meget rigtigt ud. Jeg kan da nogenlunde forstå hvad det gør, men der er en fejl i det...

SELECT COUNT( k1.lastname ) AS Antal_noegler,(SELECT COUNT( * )
FROM lime_tokens_86482
WHERE completed NOT LIKE 'N'
AND lastname = k1.lastname
GROUP BY lastname
) AS besvarelser, Antal_noegler / besvarelser
FROM lime_tokens_86482 k1
GROUP BY k1.lastname
LIMIT 0 , 30

MySQL returnerede: Dokumentation
#1054 - Unknown column 'Antal_noegler' in 'field list'

.. jeg har prøvet at tilrettet lidt, men kan ikke se løsningen..
Avatar billede kristiankogut Nybegynder
07. juni 2010 - 22:06 #5
Vedr. at skulle lave det i php, så gider jeg ikke alt arbejdet, når det kan laves forholdsvis simpelt.

Desuden vil det muligvis være formeget at lave i PHP.

Jeg har 17 forskellige tabeller med hver 19 afdelinger i og flere af afdelingerne hedder ikke det samme i de forskellige skemaer.

Jeg vil derfor lave en funktion i excel, som skal hentes på forskellige sider.

Her med de oprindelige data:

CREATE TABLE IF NOT EXISTS `lime_tokens_86482` (
  `tid` int(11) NOT NULL auto_increment,
  `firstname` varchar(40) collate utf8_unicode_ci default NULL,
  `lastname` varchar(40) collate utf8_unicode_ci default NULL,
  `email` text collate utf8_unicode_ci,
  `emailstatus` text collate utf8_unicode_ci,
  `token` varchar(36) collate utf8_unicode_ci default NULL,
  `language` varchar(25) collate utf8_unicode_ci default NULL,
  `sent` varchar(17) collate utf8_unicode_ci default 'N',
  `remindersent` varchar(17) collate utf8_unicode_ci default 'N',
  `remindercount` int(11) default '0',
  `completed` varchar(17) collate utf8_unicode_ci default 'N',
  `validfrom` datetime default NULL,
  `validuntil` datetime default NULL,
  `mpid` int(11) default NULL,
  PRIMARY KEY  (`tid`),
  KEY `lime_tokens_86482_idx` (`token`),
  KEY `idx_lime_tokens_86482_efl` (`email`(120),`firstname`,`lastname`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=436 ;

--
-- Data dump for tabellen `lime_tokens_86482`
--

INSERT INTO `lime_tokens_86482` (`tid`, `firstname`, `lastname`, `email`, `emailstatus`, `token`, `language`, `sent`, `remindersent`, `remindercount`, `completed`, `validfrom`, `validuntil`, `mpid`) VALUES
(2, '5256', '030 DELI', 'none@none.dk', 'OK', 'wnidq', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(3, '5256', '030 DELI', 'none@none.dk', 'OK', '5k4w6', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(4, '5256', '030 DELI', 'none@none.dk', 'OK', 'yx77y', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(5, '5256', '030 DELI', 'none@none.dk', 'OK', 'riwsu', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(6, '5256', '030 DELI', 'none@none.dk', 'OK', 'zziba', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(7, '5256', '030 DELI', 'none@none.dk', 'OK', 'uytmw', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(8, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'cdjhp', 'da', 'N', 'N', 0, '2010-05-27 14:11', NULL, NULL, NULL),
(9, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'k83av', 'da', 'N', 'N', 0, '2010-05-27 14:17', NULL, NULL, NULL),
(10, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'xxu2v', 'da', 'N', 'N', 0, '2010-05-28 09:54', NULL, NULL, NULL),
(11, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'ngyxe', 'da', 'N', 'N', 0, '2010-05-29 10:30', NULL, NULL, NULL),
(12, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'mqgft', 'da', 'N', 'N', 0, '2010-05-30 12:00', NULL, NULL, NULL),
(13, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'nde4v', 'da', 'N', 'N', 0, '2010-05-31 15:07', NULL, NULL, NULL),
(14, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'wsns7', 'da', 'N', 'N', 0, '2010-05-31 15:30', NULL, NULL, NULL),
(15, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', '5t439', 'da', 'N', 'N', 0, '2010-05-31 18:47', NULL, NULL, NULL),
(16, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'cqpp8', 'da', 'N', 'N', 0, '2010-06-02 17:59', NULL, NULL, NULL),
(17, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', '9tnna', 'da', 'N', 'N', 0, '2010-06-04 19:22', NULL, NULL, NULL),
(18, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'fie99', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(19, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'mhdhn', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(20, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', 'gunng', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL),
(21, '5256', '040 FRUGT & GRØNT', 'none@none.dk', 'OK', '3e2ag', 'da', 'N', 'N', 0, 'N', NULL, NULL, NULL);
08. juni 2010 - 06:13 #6
1.  Der er en fejl, ja.  Jeg beklager. Jeg kopierede mit naestsidste forsoeg i stedet for det sidste og korrekte.  Det er ", Antal_noegler/besvarelser" der skal vaek, altsaa (med min tabel:)

SELECT COUNT( k1.lastname ) AS Antal_noegler, (
SELECT COUNT( * )
FROM kristiankogut
WHERE completed NOT LIKE 'N'
AND lastname = k1.lastname
GROUP BY lastname
) AS besvarelser
FROM kristiankogut k1
GROUP BY k1.lastname

2.  Jeg foreslog ikke at du skulle lave det i php men at du skulle lave det i en applikation hvor mysql traekker dataerne ud som ovenstaaende query og applikationen saa formattere det ved at skrive "nr. 1" og udskrive procenten.  Det vil du saa goere i Excel.  Fint, men jeg toer ikke binde an med at foreslaa en loesning fordi jeg ikke kender saa meget til at integrere Excel og mysql og fordi jeg ikke er sikker paa at jeg forstaar det med de 17 tabeller.  (Jeg har det selv omvendt af dig, en php loesning ville for mig vaere en forholdsvis enkel maade at undgaa besvaeret med andre loesninger.)

3.  Jeg kommer saaledes nok ikke videre.  Med mindre du forventer flere indlaeg (det sker nok ikke fordi spoergsmaalet nu er nogle dage gammelt og der indtil nu ikke har vaeret indlaeg fra andre end mig) vil jeg foreslaa at du lukker spoergsmaalet.  Du kunne saa eventuelt oprette et nyt spoergsmaal under kategorien Excel hvor du fortaeller at du har ovenstaaende query som du gerne vil have udskrevet saaledes i Excel.  Hvis du vil give mig del-points for et delvis svar har du den mulighed selv at oprette et svar og fordele points.
Avatar billede kristiankogut Nybegynder
08. juni 2010 - 09:14 #7
Så er vi der næsten... vi mangler det som står i titlen.. altså procentkolonne..

Følgende virker fint:

SELECT lastname, COUNT( k1.lastname ) AS Antal_noegler, (

SELECT COUNT( lastname )
FROM lime_tokens_86482
WHERE completed NOT LIKE 'N'
AND lastname = k1.lastname
GROUP BY lastname
) AS besvarelser
FROM lime_tokens_86482 k1
GROUP BY k1.lastname
LIMIT 0 , 30

og jeg havde forsøgt med "(besvarelser/Antal_noegler*100) AS procent men uden held...
08. juni 2010 - 10:17 #8
Ja, det er der jeg bakker ud, lave det i mysql.  Hvis du vil have dette:


Afdeling:        Antal nøgler, besvarelser, opnået procent
nr. 1                333          111        33%
nr. 2                444          111        25%

skrevet ud i Excel saa vil det vaere langt simplere i Excel at dividere to celler med hinanden, og med hensyn til at nummerere raekkerne i mysql (nr. 1, nr. 2) ved jeg ikke om det overhovedet er muligt.  Saa som sagt jeg stopper (og haaber at jeg har hjulpet dig fremad selvom du havde forventet mere.)
Avatar billede kristiankogut Nybegynder
09. juni 2010 - 00:00 #9
Jeg løste det via PHP... Mange tak for hjælpe..  smid et svar
09. juni 2010 - 06:21 #10
Svar fra mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester