Autor Zpráva
forest1984
Profil
Ahoj, potřebuji z databáze s měřením hodnot získat data pro Grafanu s měsíční periodou. Mám 2 situace, buď získávám data pro jednu veličinu(komoditu) nebo pro skupinu takových veličin(komodit). Zda se jedná o jednotlivou veličinu nebo skupinu si ukládám jiným dotazem do proměnné $commodities , krterá nabývá hodnot např (1, 2, 3 .... ) = pro jednotlivé veličiny a např. (1grp, 2grp, 3grp ...) = pro skupiny veličin.

Tak abych dotaz mohl použít v grafaně potřebuji mít obě situace v jednom dotazu, nicméně dotaz končí chybou protože vrací více řádků pro subdotaz, samostatně dotazy v case fungují a zobrazí dané hodnoty pro každý z dvanácti měsíců. Nenapadlo by prosím někoho jak situaci řešit? Předem díky

SELECT 
measurement.period AS "time",
2020 AS "metric",
  (CASE
    WHEN '$commodities' LIKE '%grp%' 
    THEN (SELECT 
      SUM(m.value) AS "value"
      FROM group_commodity as g, measurement as m, connection as c
      WHERE g.group_id = REPLACE('$commodities', 'grp', '')
      AND c.group_id = g.group_id
      AND m.commodity_id = c.commodity_id
      AND YEAR(m.period) = 2020
      GROUP BY m.period)
    ELSE (SELECT
      value
      FROM measurement, commodity
      WHERE measurement.commodity_id = commodity.commodity_id 
      AND measurement.commodity_id = $commodities
      AND YEAR(period) = 2020
      ORDER BY measurement.period)
  END) as "value"
FROM measurement
WHERE 
YEAR(period) = 2020
tttttttt
Profil *
Místo CASE v SQL udělej podmínku na $commodities v php a rozděl to na dva dotazy.
Kajman
Profil
Místo case šáhněte po unionu.
forest1984
Profil
tttttttt:
Na webu, kde to vypisuji v tabulce, to tak rozdělené mám. Tuhle hrůzu potřebuji kvůli grafaně, kde kvůli automatizaci generování panelů v dashboardu to musí být jeden dotaz.
Kajman
Profil
Ten union jste zkoušel? Mohlo by to být něco
SELECT m.period     AS "time",
       2020         AS "metric",
       Sum(m.value) AS "value"
FROM   group_commodity AS g
       JOIN connection AS c
         ON c.group_id = g.group_id
       JOIN measurement AS m
         ON m.commodity_id = c.commodity_id
WHERE  '$commodities' LIKE '%grp%'
       AND g.group_id = Replace('$commodities', 'grp', '')
       AND Year(m.period) = 2020
GROUP  BY m.period
UNION ALL
SELECT m.period AS "time",
       2020     AS "metric",
       m.value  AS "value"
FROM   measurement AS m
       JOIN commodity AS c
         ON m.commodity_id = c.commodity_id
WHERE  '$commodities' NOT LIKE '%grp%'
       m.commodity_id = $commodities
       AND Year(m.period) = 2020
ORDER  BY m.period
forest1984
Profil
Kajman:
Díky za nápad. Přes UNION jsem to rozchodil.
SELECT 
      SUM(m.value) AS "value",
      m.period AS "time",
      DATE_FORMAT(NOW(), '%Y') AS "metric"
      FROM group_commodity as g, measurement as m, connection as c
      WHERE g.group_id = IF ('$commodities' LIKE '%grp', REPLACE('$commodities', 'grp', ''), '0')
      AND c.group_id = g.group_id
      AND m.commodity_id = c.commodity_id
      AND YEAR(m.period) = 2020
      GROUP BY m.period
UNION
SELECT
      measurement.value,
      measurement.period AS "time",
      DATE_FORMAT(NOW(), '%Y') AS "metric"
      FROM measurement, commodity
      WHERE measurement.commodity_id = commodity.commodity_id 
      AND measurement.commodity_id = IF ('$commodities' LIKE '%grp', '0', '$commodities')
      AND YEAR(period) = 2020

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0