2017-08-11 2 views
0

Je regarde un cas dans lequel nous avons un certain nombre de réservoirs remplis de liquide. La quantité de liquide est mesurée et les informations sont stockées dans une base de données. Cette mise à jour est effectuée toutes les 5 minutes. Ici, les informations suivantes sont enregistrées:MySQL - niveau de remplissage RANGE - comment l'obtenir?

  • tankId
  • FillLevel
  • TimeStamp

Je voudrais lire la base de données et classer chaque réservoir dans l'un des éléments suivants « niveau de remplissage » gammes:

  • Plage A: 0 - 40%
  • Range B: 40 - 75%
  • Gamme C: 75 - 100%

En fin de compte, je voudrais avoir la quantité de réservoirs qui sont dans la gamme A, qui sont en B et qui sont dans la gamme C . Je peux choisir niveau de remplissage d'un DISTINCT TankId, mais cela ne fonctionne pas ...

SELECT COUNT(DISTINCT tankId) 
FROM TankDemo 
WHERE (filllevel > 0 AND filllevel < 40); 

Évidemment, il ne me donne pas le nombre correct de réservoirs par plage. J'espère que certains d'entre vous ont des suggestions sur la façon dont je peux obtenir ces données.

Merci beaucoup

+0

Voir CAS. Vous avez encore du mal? Voir https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

Répondre

0

Vous pouvez le faire avec une instruction CASE:

SELECT sum(
     CASE 
      WHEN filllevel>=0 and filllevel<40 
      THEN 1 
      ELSE 0 
     END) AS 'Range A', 
     sum(
     CASE 
      WHEN filllevel>=40 and filllevel<=79 
      THEN 1 
      ELSE 0 
     END) AS 'Range B', 
     sum(
     CASE 
      WHEN filllevel>79 and filllevel<=100 
      THEN 1 
      ELSE 0 
     END) AS 'Range C' 
FROM TankDemo ; 
+0

Merci pour cela. J'ai juste essayé ceci et cela sépare le fill_level par RANGE. Le défi maintenant pour obtenir seulement les dernières données par réservoir (affichera un exemple de données ci-dessous) – Jeroen

+0

Ne le faites pas, faites simplement une autre question. Si celui-ci est résolu, acceptez la réponse et augmentez-la, s'il vous plaît – nacho

0

En utilisant la déclaration de cas, vous pouvez obtenir le résultat que vous voulez. Essayez ci-dessous celui qui fonctionnera comme vous le souhaitez

SELECT count(distinct 
      CASE 
       WHEN filllevel>=0 and filllevel<40 
       THEN tankId END) AS 'Range A', 
      count(distinct 
      CASE 
       WHEN filllevel>=40 and filllevel<=75 
       THEN tankId END) AS 'Range B', 
      count(distinct 
      CASE 
       WHEN filllevel>75and filllevel<=100 
       THEN tankId 
      END) AS 'Range C' 
    FROM TankDemo ;