[ vbbojan @ 22.04.2020. 22:39 ] @
Evo test date:

Code:

CREATE TABLE `test` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `MemberID` int(11) DEFAULT NULL,
  `Year` int(11) DEFAULT NULL,
  `Ammount` decimal(11,0) DEFAULT NULL,
  PRIMARY KEY (`ID`)
)

INSERT INTO `test` (`ID`, `MemberID`, `Year`, `Ammount`) VALUES 
  (1, 1, 2015, 500),
  (2, 2, 2016, 1000),
  (3, 1, 2016, 1000),
  (4, 1, 2014, 1000),
  (5, 2, 2017, 1000),
  (6, 2, 2018, 1000),
  (7, 2, 2019, 1000),
  (8, 2, 2020, 1000),
  (9, 1, 2020, 1000),
  (10, 1, 2015, 500),
  (11, 1, 2018, 1000),
  (12, 1, 2017, 1000),
  (13, 1, 2019, 1000),
  (14, 3, 2016, 500),
  (15, 3, 2016, 500),
  (16, 3, 2017, 500),
  (17, 3, 2017, 500),
  (18, 3, 2018, 1000),
  (19, 3, 2019, 1000),
  (20, 3, 2020, 1000),
  (21, 4, 2020, 1000),
  (22, 5, 2019, 1000),
  (23, 5, 2020, 1000);


Treba mi upit koji će da izdvoji samo one koji imaju iznos u 2020 godini ali i da nemaju iznose u prethodnim godinama.
Iz prilozene test date očekivani rezultat treba da bude samo record (21, 4, 2020, 1000)

Tnx i pozdrav.

[ Deunan @ 23.04.2020. 00:25 ] @

Moze ovako:
Code:
SELECT ID, MemberID, Ammount, GROUP_CONCAT(DISTINCT Year) as conc FROM `test` GROUP by MemberID HAVING conc = '2020'

[ vbbojan @ 23.04.2020. 08:29 ] @
Hvala puno!

Kakva fora da se elegantno otarasis neželjenih sa GROUP_CONCAT DISTINCT :-)
Ne bi se setio za još tri karantina.

[ djoka_l @ 23.04.2020. 08:45 ] @
Ne koristim puno MySQL, pa bih zato napisao upit koji radi na svim bazama:
Code:

  select *
  from test x
  where not exists ( select 1 from test where memberid=x.memberid and year != 2020);


Ovaj upit je dobar ako je memberid indeksiran. Sporija verzija bi bila sa NOT IN konstrukcijom gde mi unutrašnji upit vratio memberid onih koji su imali uplatu pre 2020.
Code:

  select *
  from test x
  where memberid not in ( select distinct memberid from test where year != 2020);