Объединять строки, если они имеют одинаковый идентификатор и одинаковое значение или значение равно нулю в PHP - PullRequest
0 голосов
/ 17 мая 2018

Я использую PHP-программирование и базу данных Microsoft Access.Оба подключены с использованием PDO.

У меня проблема с объединением значений столбца в одной таблице, если значения идентификатора сотрудника "1stHalf" или "2ndHalf" имеют значения в одном месяце и году.

Это потому, что в моей ситуации сотрудник может платить один раз в месяц или два раза в месяц.Вот почему в моей таблице есть столбцы 1-й и 2-й половин.

Но дело в том, что у меня есть только 1 столбец с именем "EPFee", и он будет объединен на основе значения "1stHalf" или "2ndHalf", независимо от того,этот месяц один раз в месяц или два раза в месяц.

Таблица, которая у меня сейчас есть:

Employee ID | 1stHalf | 2ndHalf | Month | Year | EPFee    
1011        |  0      |   1     |  2    | 2017 | 15.00   
1011        |  1      |   0     |  2    | 2017 | 29.00

Вывод, который я хочу:

Employee ID | 1stHalf | 2ndHalf | Month | Year | EPF1stFee | EPF2ndFee   
1011        |  1      |   1     |   2   | 2017 |   29.00   |   15.00

Если значение 2ndHalf равно0 в месяце 2/2017 Результат должен быть таким:

Employee ID | 1stHalf | 2ndHalf | Month | Year | EPF1stFee | EPF2ndFee   
1011        |  1      |   0     |   2   | 2017 |   29.00   |   0.00

Здесь мой код обновлен благодаря sr hs :

<?php
    $db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=C:\Users\User\Desktop\Demo2018.mdb; Uid=; Pwd=COMPLETEPAYROLL;");

    $sql  = "SELECT `Employee ID`, `1stHalf`, `2ndHalf`, `Month`, `Year` FROM `tblPAyTrans` WHERE `Employee ID` = '1011' AND Month = '2' AND Year='2017'";

    $result = $db->query($sql);

    echo "<br>RESULT: <br><br>";
    echo "<table border='2'>
            <tr>
                <th>Employee ID</th>
                <th>1st Half</th>
                <th>2nd Half</th>
                <th>Month</th>
                <th>Year</th>
                <th>EPF1stFee</th>
                <th>EPF2ndFee</th>
            </tr>";

        $prevEmpId  = "0";
        $FirstHalf  = "0";
        $SecondHalf = "0";
        $Month      = "";
        $Year       = "";
        while ($row = $result->fetch()) {
            // You can take the following three lines out of the loop, as they remain constant
            $EmployeeID = $row['Employee ID'];
            $Month = $row['Month'];
            $Year  = $row['Year'];

            // Only change the value if non-zero
            if ($FirstHalf === "0"){
                $FirstHalf = $row['1stHalf'];
                $query1 = "SELECT `EPFee` FROM `tblPAyTrans` WHERE `Employee ID` = '$EmployeeID' AND `1stHalf` = '$FirstHalf'";
                $result2 = $db->query($query1);
                $getVal1 = $result2->fetch();
                $EPF1stFee = $getVal['EPFee'];
            }

            // Only change the value if non-zero
            if ($SecondHalf === "0"){
                $SecondHalf = $row['2ndHalf'];
                $query2 = "SELECT `EPFee` FROM `tblPAyTrans` WHERE `Employee ID` = '$EmployeeID' AND `2ndHalf` = '$SecondHalf'";
                $result3 = $db->query($query2);
                $getVal2 = $result3->fetch();
                $EPF2ndFee = $getVal2['EPFee'];
            }

        }

        // Print the record
            echo "<tr>";
                echo "<td>" . $EmployeeID. "</td>";
                echo "<td>" . $FirstHalf. "</td>";
                echo "<td>" . $SecondHalf. "</td>";
                echo "<td>" . $Month. "</td>";
                echo "<td>" . $Year. "</td>";
                echo "<td>" . $EP1stFee. "</td>";
                echo "<td>" . $EP2ndFee. "</td>";
            echo "</tr>";

        echo "</table>";
    ?>

Любые идеи для решенияэто ??

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Если вы ищете решение на PHP,

<?php
$db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=C:\Users\User\Desktop\Demo2018.mdb; Uid=; Pwd=COMPLETEPAYROLL;");

$sql  = "SELECT `Employee ID`, `1stHalf`, `2ndHalf`, `Month`, `Year` FROM `tblPAyTrans` WHERE `Employee ID` = '1011' AND Month = '2' AND Year='2017'";

$result = $db->query($sql);

echo "<br>RESULT: <br><br>";
echo "<table border='2'>
        <tr>
            <th>Employee ID</th>
            <th>1st Half</th>
            <th>2nd Half</th>
            <th>Month</th>
            <th>Year</th>
        </tr>";

    $prevEmpId  = "0";
    $FirstHalf  = "0";
    $SecondHalf = "0";
    $Month      = "";
    $Year       = "";
    while ($row = $result->fetch()) {
        // You can take the following three lines out of the loop, as they remain constant
        $EmployeeID = $row['Employee ID'];
        $Month = $row['Month'];
        $Year  = $row['Year'];

        // Only change the value if non-zero
        if ($FirstHalf === "0")
            $FirstHalf = $row['1stHalf'];

        // Only change the value if non-zero
        if ($SecondHalf === "0")
            $SecondHalf = $row['2ndHalf'];

    }

    // Print the record
        echo "<tr>";
            echo "<td>" . $EmployeeID. "</td>";
            echo "<td>" . $FirststHalf. "</td>";
            echo "<td>" . $SecondHalf. "</td>";
            echo "<td>" . $Month. "</td>";
            echo "<td>" . $Year. "</td>";
        echo "</tr>";

    echo "</table>";
?>

это также можно сделать для всех сотрудников с помощью следующего кода,

<?php
$db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=C:\Users\User\Desktop\Demo2018.mdb; Uid=; Pwd=COMPLETEPAYROLL;");

$sql  = "SELECT `Employee ID`, `1stHalf`, `2ndHalf`, `Month`, `Year` FROM `tblPAyTrans` order by `EmployeeID` asc";

$result = $db->query($sql);

echo "<br>RESULT: <br><br>";
echo "<table border='2'>
        <tr>
            <th>Employee ID</th>
            <th>1st Half</th>
            <th>2nd Half</th>
            <th>Month</th>
            <th>Year</th>
        </tr>";

    $prevEmpId  = "0";
    $FirstHalf  = "0";
    $SecondHalf = "0";
    $Month      = "";
    $Year       = "";
    while ($row = $result->fetch()) {
        $EmployeeID = $row['Employee ID'];

        // Check if employee id is repeating, if yes, store the required values
        if (($prevEmpId === "0") || ($prevEmpId === $EmployeeID)) {
            if ($prevEmpId === "0")
                $prevEmpId = $EmployeeID;
            if (($FirstHalf === "0") || ($row['1stHalf'] !== "0"))
                $FirstHalf = $row['1stHalf'];
            if (($SecondHalf === "0") || ($row['2ndHalf'] !== "0"))
                $SecondHalf = $row['2ndHalf'];
            $Month = $row['Month'];
            $Year  = $row['Year'];
        }

        // When the employee Id changes print the values onto the table
        else {
            // Print old values
            echo "<tr>";
                echo "<td>" . $EmployeeID. "</td>";
                echo "<td>" . $FirststHalf. "</td>";
                echo "<td>" . $SecondHalf. "</td>";
                echo "<td>" . $Month. "</td>";
                echo "<td>" . $Year. "</td>";
            echo "</tr>";                

            // Set the new values as the employee id  changed
            $prevEmpId  = $EmployeeID;
            $FirstHalf  = $row['1stHalf'];
            $SecondHalf = $row['2ndHalf'];
            $Month      = $row['Month'];
            $Year       = $row['Year'];
        }
    }

    // Print last record
    // As the last record will be skipped before being displayed
        echo "<tr>";
            echo "<td>" . $EmployeeID. "</td>";
            echo "<td>" . $FirststHalf. "</td>";
            echo "<td>" . $SecondHalf. "</td>";
            echo "<td>" . $Month. "</td>";
            echo "<td>" . $Year. "</td>";
        echo "</tr>";

    echo "</table>";
?>

Убедитесь, что запрос отсортирован по EmployeeId ASC

0 голосов
/ 17 мая 2018

Решает ли этот SQL проблему?

SELECT `Employee ID`, sum(`1stHalf`) AS 1stHalf, sum(`2ndHalf`) AS 2ndHalf, `Month`, `Year`
FROM tblPAyTrans
GROUP BY `Employee ID`, `Month`, `Year`

Результат:

Employee ID 1stHalf 2ndHalf Month   Year
1011           1       1      2     2017

Проверьте свой результат здесь: http://sqlfiddle.com/#!9/98ddd/4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...