Получить сумму между датами с помощью UNION - PullRequest
1 голос
/ 08 марта 2020

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

SELECT z.dates
   COALESCE(a.allscore) AS cricket_score,
   COALESCE(b.allscore) AS football_score
   FROM (
   SELECT dateby AS dates FROM cricket_table
   UNION
   SELECT dateby FROM football_table) AS z
   LEFT JOIN (SELECT dateby AS dates, SUM(score) AS allscore FROM cricket_table
            WHERE dateby BETWEEN '2020-01-01' AND '2020-03-03'
           GROUP BY dates) a USING (dates)
   LEFT JOIN (SELECT dateby AS dates, SUM(score) AS allscore FROM football_table
            WHERE dateby BETWEEN '2020-01-01' AND '2020-03-03'
           GROUP BY dates) b USING (dates)
GROUP BY z.dates

[полный код со структурой базы данных]

$sql = "
create table cricket_table  (player varchar(50), score int, dateby date);

create table football_table  (player varchar(50), score int, dateby date);

insert into cricket_table values
('Sohail',32, '2020-01-02'),
('Saleem',65, '2020-01-02'), 
('Hamid',76, '2020-01-02'),

('Sohail',33, '2020-05-02'),
('Saleem',44, '2020-05-02'),
('Hamid',22, '2020-05-02');

insert into football_table values 
('Sohail',1, '2020-01-02'),
('Saleem',2, '2020-01-02'),
('Hamid',3, '2020-01-02'),

('Sohail',6, '2020-05-02'),
('Saleem',7, '2020-05-02'),
('Hamid',8, '2020-05-02');
";

$result = $db->prepare($sql);
$result->execute();

$query = $db->prepare("SELECT z.dates
       COALESCE(a.allscore) AS cricket_score,
       COALESCE(b.allscore) AS football_score
       FROM (
   SELECT dateby AS dates FROM cricket_table
   UNION
   SELECT dateby FROM football_table) AS z
   LEFT JOIN (SELECT dateby AS dates, SUM(score) AS allscore FROM cricket_table
                WHERE dateby BETWEEN '2020-01-01' AND '2020-03-03'
               GROUP BY dates) a USING (dates)
  LEFT JOIN (SELECT dateby AS dates, SUM(score) AS allscore FROM football_table
                WHERE dateby BETWEEN '2020-01-01' AND '2020-03-03'
               GROUP BY dates) b USING (dates)
    GROUP BY dates
");
$query->execute();
echo '<table><tr><th>Player Name</th><th>Cricket</th><th>Football</th></tr>';
while($row = $query->fetch(PDO:: FETCH_ASSOC) ) {
    echo '<tr>
        <td>'.$row['player'].'</td>
        <td>'.$row['cricket_score'].'</td>
        <td>'.$row['football_score'].'</td>
     </tr>';
}
echo '</table>';

(https://pastebin.com/prvsd1X8 )

Ответы [ 2 ]

1 голос
/ 08 марта 2020

У вас есть несколько незначительных проблем:

  1. Отсутствует запятая после z.dates в первой строке
  2. У вас нет значения по умолчанию для функции COALESCE, когда allscore is NULL
  3. Ваш диапазон дат в подзапросах (BETWEEN '2020-01-01' AND '2020-03-03') не включает все даты в cricket_table и football_table
  4. Вам не нужен GROUP BY для внешнего запроса.

Таким образом, ваш запрос должен выглядеть следующим образом:

SELECT z.dates,
       COALESCE(a.allscore, 0) AS cricket_score,
       COALESCE(b.allscore, 0) AS football_score
FROM (
  SELECT dateby AS dates FROM cricket_table
  UNION
  SELECT dateby FROM football_table
) AS z
LEFT JOIN (SELECT dateby AS dates, SUM(score) AS allscore 
           FROM cricket_table
           WHERE dateby BETWEEN '2020-01-01' AND '2020-05-03'
           GROUP BY dates
           ) a USING (dates)
LEFT JOIN (SELECT dateby AS dates, SUM(score) AS allscore 
           FROM football_table
           WHERE dateby BETWEEN '2020-01-01' AND '2020-05-03'
           GROUP BY dates
           ) b USING (dates)

Вывод данных для примера:

dates       cricket_score   football_score
2020-01-02  173             6
2020-05-02  99              21

Демо на dbfiddle

0 голосов
/ 08 марта 2020

Итак, если вам нужны даты cricket_score и football_score, проверьте приведенный ниже запрос, соответствует ли он вашим ожиданиям

SELECT dateby, SUM(cricket_score) AS cricket_score, SUM(football_score) AS football_score
FROM (

SELECT c.dateby, c.score AS cricket_score, 0 AS football_score 
FROM cricket_table AS c 
WHERE c.dateby BETWEEN '2020-01-01' AND '2020-07-05' 

UNION

SELECT f.dateby, 0 AS cricket_score, f.score AS football_score 
FROM football_table AS f 
WHERE f.dateby BETWEEN '2020-01-01' AND '2020-07-05'

) AS temp GROUP BY dateby

Простой и легкий подход

Демонстрация: http://sqlfiddle.com/# ! 18 / fc606 / 15

вывод

dateby       cricket_score   football_score
2020-01-02    173             6
2020-05-02    99              21
...