2016-08-09 2 views
1

Я очень новичок в программировании, и теперь у меня есть проблема для его быстрого решения. Пытайтесь только на 1 неделю и дайте некоторый результат, который может удовлетворить меня. Любой может помочь мне с этим, Heres мой стол и результат, что я хотел показать: enter image description heremysql кол-во кол-во подключений с одним запросом

это результат the problem ss

я не пытаюсь и пытаюсь этот код для более недели, и его все еще ничего :

enter code here SELECT idkt.id, 
    idkt.nama, 
    idkt.satuan, 
    trgt.nilai , 
    tbl.*, 
    ROUND((tbl.Triwulan_1/trgt.nilai * 100), 2) Persen_1, 
    ROUND((tbl.Triwulan_2/trgt.nilai * 100), 2) Persen_2, 
    ROUND((tbl.Triwulan_3/trgt.nilai * 100), 2) Persen_3, 
    ROUND((tbl.Triwulan_4/trgt.nilai * 100), 2) Persen_4 
FROM indikator idkt 
left JOIN (
    SELECT id_indikator, 
     YEAR(tgl) tahun, 
     SUM(CASE 
     WHEN MONTH(tgl) BETWEEN 1 AND 3 THEN 
      1 
     END) AS Triwulan_1, 
     SUM(CASE 
     WHEN MONTH(tgl) BETWEEN 4 AND 6 THEN 
      1 
     END) AS Triwulan_2, 
     SUM(CASE 
     WHEN MONTH(tgl) BETWEEN 7 AND 9 THEN 
      1 
     END) AS Triwulan_3, 
     SUM(CASE 
     WHEN MONTH(tgl) BETWEEN 10 AND 12 THEN 
      1 
     END) AS Triwulan_4 

     FROM msttrans 
     WHERE YEAR(tgl) = ".$tahun." 
      GROUP BY id_indikator, YEAR(tgl)) tbl 
    ON (idkt.id = tbl.id_indikator) 
    left JOIN target trgt 
     ON (trgt.id_indikator = idkt.id 
      AND YEAR(trgt.tahun) = tbl.tahun) 

left JOIN (select target.nilai as fnilai from target where id_indikator  is not NULL) trgt on trgt.id_indikator = idkt.id 

    ORDER BY idkt.id ASC 

ответ

0

Если какие входы арифметическим выражения типа

ROUND((tbl.Triwulan_1/trgt.nilai * 100), 2) 

равны нулю, полученное выражение также будет равно нулю. Вы, вероятно, следует попытаться изменить эти виды выражений из

SUM(CASE WHEN MONTH(tgl) BETWEEN 1 AND 3 THEN 1 END) AS Triwulan_1 

в

SUM(CASE WHEN MONTH(tgl) BETWEEN 1 AND 3 THEN 1 ELSE 0 END) AS Triwulan_1 

, чтобы избежать слишком много попыток работать с нулевыми значениями.

Кроме того, вы должны устранять неполадки, проверяя свои внутренние запросы один за другим. Убедитесь, что они работают (особенно те, что содержат GROUP BY), прежде чем использовать их в соединении.

РедактироватьLEFT JOIN операции с ON условиями, которые не соответствуют ни одной строке возвращает нулевые значения для столбцов в левой таблице. Это общий источник неожиданных нулевых значений. (Если вы используете JOIN вместо LEFT JOIN, запрос подавляет строки из правой таблицы, если они не совпадают с левой таблицей.)

Вы можете устранить эти ошибки с помощью таких выражений.

SELECT ... tbl.Triwulan_1, trgt.nilai, ROUND((tbl.Triwulan_1/trgt.nilai * 100), 2), ... 
+0

о, ТНХ Олли за советом, но может у дать мне ключ, почему мой код здесь "ROUND ((tbl.Triwulan_1/trgt.nilai * 100), 2) Persen_1," возвращать нуль соз значение, его уже существует в базе данных, n почему его же с столбцом nilai на целевой таблице, который не отображается? .. еще раз thx для быстрого ответа – esto

+0

еще раз спасибо тысячу за ваш совет, ollie, u спас мой день, решил мою проблему, может быть легко без u THANKSSS – esto