SUMming SUMs, соединенные через UNION в MySQL и отображаемые с помощью ECHO в PHP - PullRequest
0 голосов
/ 05 октября 2019

Для каждого хирургического центра я построил MySQL SUM запросов, которые суммируют количество выполненных хирургических процедур. В PHP я отображаю результаты в виде таблицы с двумя столбцами.

Теперь я хочу вычислить сумму по суммам всех центров и отобразить их аналогично.

Проблема в том, чтоКоманда echo показывает вид хирургических процедур друг под другом, но только самый первый из результатов SUM over SUMs (см. 3.)

Код функции PHP и код запроса SQL выглядят так:

function getGlobalAlleOPVerfahrenStratification() {
  global $oDatabase;
  $qQuery = ' 
  SELECT SUM(X1.Surgery1) AS "Surgery1" FROM (
    SELECT SUM(op.OPVerfahren = "0") AS "Surgery1"
    FROM operation op
    UNION
    SELECT SUM(op.OPVerfahren = "1") AS "Surgery1"
    FROM operation op
    UNION
    SELECT SUM(op.OPVerfahren = "20") AS "Surgery1"
    FROM operation op
  ) X1
  UNION
  SELECT SUM(X2.Surgery2) AS "Surgery2" FROM (
    SELECT SUM(op.OPVerfahren = "0") AS "Surgery2"
    FROM operation op
    UNION
    SELECT SUM(op.OPVerfahren = "1") AS "Surgery2"
    FROM operation op
    UNION
    SELECT SUM(op.OPVerfahren = "20") AS "Surgery2"
    FROM operation op
  ) X2; ';

  $rQuery = mysql_query($qQuery, $oDatabase);
  $result = array("count" => mysql_num_rows($rQuery), "result" => $rQuery);
  return $result;
}


function writeGlobalOP1OPVerfahrenStratification($rQuery) {
  if (!$rQuery) {
    $message = '<br>';
    $message .= '<b>Ungültige Abfrage:</b> ' . mysql_error() . '<br>';
    $message .= '<b>Gesamte Abfrage:</b> ' . $qQuery . '<br>';
    echo $message;
  }

  if (mysql_num_rows($rQuery) == 0) {
    $message = '<br>';
    $message .= '<p class="error">Zu diesem Zeitraum liegen noch keine Daten vor.</p> ' . mysql_error() . '<br>';
    echo $message;
  }

  //echo '<table>';
  echo '<tr>';
  echo '<th style="font-size: 30px; border-left: 6px solid blue;">';
  echo "Alle Zentren";
  echo '</th>';
  echo '<th class="data_table_r" style="font-size: 30px;">';
  echo "Summen";
  echo '</th>';
  echo '</tr>';

  while ($row = mysql_fetch_assoc($rQuery)) {
    echo '<tr>';
    echo '<td style="font-size: 30px; border-left: 6px solid blue;">';
    echo "Operation 1";
    echo '</td>';
    echo '<td class="data_table_r" style="font-size: 30px;">';
    echo $row['Surgery1'];
    echo '</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<td style="font-size: 30px; border-left: 6px solid blue;">';
    echo "Operation 2";
    echo '</td>';
    echo '<td class="data_table_r" style="font-size: 30px;">';
    echo $row['Surgery2'];
    echo '</table>';
    }
}

Вместо всех команд

echo ...

после оператора while, просто написав

echo $row['Surgery1'];
echo '<br />';

PHP отображает операции один за другим, разделенные возвратом каретки

Тем не менее, я ожидаю таблицу с двумя столбцами, слева от которой дано название Операции, и справа от которой указано количество операций.

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

Кто-нибудь, пожалуйста, есть решение для меня?

1 Ответ

0 голосов
/ 05 октября 2019

Объединение объединяет только строки, которые не идентичны. Так что для ваших целей объединение не является правильным выбором во всех случаях.

Итак, с этой таблицей

CREATE TABLE operation
(`id` int, `OPVerfahren` varchar(10))
;

INSERT INTO operation
(`id`, `OPVerfahren`)
VALUES
(1, '0'),
(2, '1'),
(4, '0'),
(5, '20'),
(6, '0'),
(7, '1'),
(8, '20'),
(9, '0'),
(10, '0')
;

И с этим оператором выбора

    SELECT "Surgery1",SUM(IF (op.OPVerfahren = "0",1,
               if( op.OPVerfahren = "1",1,
                if (op.OPVerfahren = "20", 1,0)
                 )
              )
          ) "Surgery1"
  FROM operation op
  union
  SELECT "Surgery2", SUM(IF (op.OPVerfahren = "0",1,
               if( op.OPVerfahren = "1",1,
                if (op.OPVerfahren = "20", 1,0)
                 )
              )
          ) "Surgery2"
FROM operation op

Вы получаете следующеерезультат

Surgery1    Surgery1
Surgery1    9
Surgery2    9

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

Я лично сделал бы следующее

    SELECT SUM(IF (op.OPVerfahren = "0",1,
               if( op.OPVerfahren = "1",1,
                if (op.OPVerfahren = "20", 1,0)
                 )
              )
          ) "Surgery1",
          SUM(IF (op.OPVerfahren = "0",1,
               if( op.OPVerfahren = "1",1,
                if (op.OPVerfahren = "20", 1,0)
                 )
              )
          ) "Surgery2"
FROM operation op

Что бы вы получили

Surgery1    Surgery2
9           9

Но ваш оригиналкажется, что вы хотели два ряда, так что ...

...