2014-02-13 8 views
0

Я изучаю PHP еще как новичок, и моя компания поручила мне создать программу для расчета ежедневных продаж за смену.Сумма значений MYSQL из разных таблиц

У меня есть две таблицы:

attendance 
id 
date 
time 
brand 
branch 
shift 



attendanceout 
id 
date 
time 
brand 
branch 
sales 

Так что, когда сотрудники приходят в они положили участие в котором идет к столу посещаемости и когда они выходят их запись идет в attendanceout с их продаж в день.

То, что я хочу, данные приходят, как это:

Date   Shift  Total Sales 
10/02/2014 Morning 2000 
10/02/2014 Closing 1000 
11/02/2014 Morning 3000 
11/02/2014 Closing 1500 

Я надеюсь, что мне удалось это объяснить.

Это то, что я в настоящее время:

SELECT a.date, 
SUM(IF(b.shift = 'Morning' AND b.date=a.date AND a.branch='DCC' AND a.brand='NISA', a.sales, 0)) AS 'Morning', 
    CASE WHEN b.shift = 'Mid' AND b.date=a.date AND a.branch='DCC' AND a.brand='NISA' THEN sum(a.sales) ELSE 0 END AS Mid, 
    CASE WHEN b.shift = 'Closing' THEN sum(a.sales) ELSE 0 END AS Closing, 
    sum(a.sales) AS Total 
FROM attendanceout a, attendance b 
WHERE a.date>='$fromdate' AND a.date<='$todate' 
GROUP BY a.date 

Я также хочу знать, как отобразить его в PHP.

+0

Можете ли вы дать образцы данных или скрипку, если это возможно? –

+0

Что вы делаете с филиалом и брендом? –

ответ

0

Если я правильно прочитал ваш вопрос, у вас есть два значения «shift», а именно: Morning и Closing.

Непонятно, как вы можете присоединиться к двум таблицам однозначно. Я предполагаю, что это на id и date. Я полагаю, что ваши time столбцы в двух таблицах не совпадают.

Что произойдет, если работник работает за полночь?

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

SELECT a.date, b.shift, SUM(b.sales) as total_sales 
    FROM attendance AS a 
    JOIN attendanceout AS b ON a.id=b.id AND a.date=b.date 
WHERE a.branch = 'DCC' 
    AND a.brand = 'NISA' 
    AND a.date >= :startdate 
    AND a.date <= :enddate 
GROUP BY a.date, b.shift DESC WITH ROLLUP 

The WITH ROLLUP даст вам накопительную строку после каждого date и shift подряда с продажами всего дня в.

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

Я использовал ORDER BY ... shift DESC в качестве взлома, потому что мы хотим, чтобы сдвиг Morning происходил до смещения Closing.

Вот PHP часть ...

$db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'username', 'password'); 
$query = "paste it in from up there^"; 
$stmt = $db->prepare($query); 
$stmt->execute(array(":startdate" => $start, ":enddate:" => $end)); 

$stmt->bindColumn(1, $date); 
$stmt->bindColumn(2, $shift); 
$stmt->bindColumn(3, $sales); 

echo "<table>"; 
echo "<th><td>Date</td><td>Morning</td><td>Closing</td><td>Total</td></th>\n"; 

$olddate = ""; 
while ($stmt->fetch(PDO::FETCH_BOUND)) { 
    if (isset ($date)) { /* skip NULL date (at end of rollup) */ 
    if ($olddate != $date) { 
     /* new date, new row */ 
     if ($olddate != "") { 
     /* if we had a previous date row, end it */ 
     echo "</tr>\n"; 
     } 
     /* start a new row */ 
     echo "<tr><td>$date</td>"; 
     $olddate = $date; 
    } 
    /* write the sales value to the table */ 
    echo "<td>$sales</td>"; 
    } 
    if ($olddate != "") { 
    /* we had a previous date row, end it */ 
    echo "</tr>\n"; 
    } 
} 
echo "<table>\n"; 

Это не будет работать правильно, если конкретный день полностью отсутствует определенный сдвиг; он предполагает, что каждый день в вашем наборе результатов SQL представлен тремя строками, по одному для каждой смены. Но это должно заставить вас начать.

+0

Как показать информацию в виде таблицы в php? Извините, я noob :) – qadir5000

+0

Получение ошибки: неправильное использование CUBE/ROLLUP и ORDER BY – qadir5000

+0

Попробуйте «GROUP BY date, shift DESC WITH ROLLUP», опустите «ORDER BY». –

Смежные вопросы