Как получить сумму одинакового и разного значения в одном ряду? - PullRequest
0 голосов
/ 28 апреля 2019

таблица 1
процентная стоимость invno
1 18% 18,00
1 18% 18,00
2 18% 18,00
2 28% 28,00

таблица 2
идентификатор в процентах
1 18%
2 28%

Значения столбца таблицы 2 percentage должны стать заголовками столбцов вывода.

В таблице 1 invno 1 имеет 2 записи, но такое же процентное значение 18%;invno 2 имеет 2 записи с разными процентными значениями.

output

invno    percentage 18%    percentage 28%
  1           36.00             0.00
  2           18.00            28.00

Пока я написал:

SELECT
    `invno`,
    SUM(CASE WHEN `percentage` = '18' THEN `percentage` ELSE NULL END) AS `percentage_18`,
    SUM(CASE WHEN `percentage` = '28' THEN `percentage` ELSE NULL END) AS `percentage_28`
FROM `table1`
GROUP BY `invno`
HAVING 18 IS NOT NULL AND 28 IS NOT NULL
ORDER BY `invno`

Этохорошо, но я хочу получить проценты динамически.

1 Ответ

0 голосов
/ 29 апреля 2019

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

if (!$conn = new mysqli("localhost", "root","","dbname")) {
    echo "Database Connection Error"; // $conn->connect_error
} else {
    if (!$result = $conn->query("SELECT DISTINCT percentage FROM percents ORDER BY percentage")) {
        echo "Syntax Error"; // $conn->error
    } else {
        $select_columns = ['invno'];
        foreach ($result as $row) {
            $percent = (int)$row['percentage'];
            $select_columns[] = "SUM(CASE WHEN percentage = {$percent} THEN `percentage` ELSE 0 END) AS percentage_{$percent}";
        }
        if (!$result = $conn->query("SELECT " . implode(', ', $select_columns) . " FROM invoices GROUP BY invno ORDER BY invno")) {
            echo "Syntax Error"; // $conn->error
        } else {
            echo "<table border=1>";
                foreach ($result as $index => $row) {
                    if (!$index) {
                        echo '<tr><th>' , implode('</th><th>', array_keys($row)) , '</th></tr>';
                    }
                    echo '<tr><td>' , implode('</td><td>', $row) , '</td></tr>';
                }
            echo "</table>";
        }
    }
}

По сути, я запросил уникальные процентные значения из таблицы2, а затем использовал эти значения для динамического построения выражений SUM(CASE...)) в таблице1. Если это не совсем так, как вам требуется для ваших реальных данных проекта, пожалуйста, предоставьте лучшее / большее представление ваших данных БД, которое изолирует проблему, чтобы я мог обновить свой ответ.

...