Как получить заголовки из списка данных на основе предложения where и подзапроса - PullRequest
0 голосов
/ 21 декабря 2011

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

Date     A    OHS     OMSN    OMSS
date1    1     1        2       3
date2    4     5        6       7
date...   ..    ..      ..      ..

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

Select calendar.datefield As 'Date',
  Count(FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d')) As 'Count'
From workorders Right Join
  calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') =
      calendar.datefield)
Where calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d')
Group By calendar.datefield

Этот запрос дает мне общее количество заказов для всех местоположений за каждый день в определенном диапазоне. В том числе это нормально, но я хочу иметь еще 3 столбца, которые фильтруются каждым конкретным кремом. Если я добавлю название здания следующим образом:

Select calendar.datefield As 'Date', workorders.location,
  Count(FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d')) As 'Count'
From workorders Right Join
  calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') =
      calendar.datefield)
Where calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d')
Group By calendar.datefield, workorders.location

Тогда таблица дает мне данные, которые мне нужны, но не столбцы, которые я ищу. Данные будут где-то лежать так:

2011-09-08  OHS     27
2011-09-09  OHS     24
2011-09-10  NULL    0
2011-09-11  NULL    0
2011-09-12  OHS     23
2011-09-13  OHS     18
2011-09-13  OMS-N   1
2011-09-14  OHS     20

Я хочу извлечь из этого запроса, выбрав дату, затем номера, где это OHSN, затем номера, где это OMSN, затем номера, где это OMSS и т. Д ...

Должен быть более простой способ сделать это, и я буквально трудился целыми днями, пытаясь соединить этот запрос.

Я надеюсь, что кто-то может помочь. За последние несколько месяцев я выучил mysql на лету, и любая помощь очень ценится.

_ _ ДАЛЬНЕЙШИЙ ОБЗОР:

SELECT calendar.datefield, tOHS.Count AS 'OHS'
FROM calendar
LEFT JOIN (
SELTCT workorders.school, Count( workorders.dateSubmitted ) AS 'Count', FROM_UNIXTIME( workorders.dateSubmitted, '%Y-%m-%d' ) AS test
FROM workorders
RIGHT JOIN calendar ON ( FROM_UNIXTIME( workorders.dateSubmitted, '%Y-%m-%d' ) = calendar.datefield )
WHERE calendar.datefield
BETWEEN '2011-08-30'
AND date_format( now( ) , '%Y-%m-%d' )
AND School = 'OHS'
GROUP BY calendar.datefield, workorders.school
)tOHS ON calendar.datefield = tOHS.test
WHERE calendar.datefield
BETWEEN '2011-08-30'
AND date_format( now( ) , '%Y-%m-%d' )

Возвращает даты и ежедневный счет для первого местоположения OHS. КОГДА я попробую это:

select calendar.datefield, tOHS.Count as 'OHS'
from calendar
LEFT JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as test
        From workorders Right Join
      calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') =
          calendar.datefield)
    Where calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d') AND School = 'OHS'
    Group By calendar.datefield,workorders.school
    ) tOHS
 on calendar.datefield = tOHS.test
 LEFT JOIN
 (
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as test
        From workorders Right Join
      calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') =
          calendar.datefield)
    Where calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d') AND School = 'OMS-S'
    Group By calendar.datefield,workorders.school
    ) tOMSS
 on calendar.datefield = tOHS.test
 WHERE calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d')

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

1 Ответ

1 голос
/ 21 декабря 2011

После нескольких часов исследований и переосмысления я решил, как это сделать. По сути, нам нужно выбрать каждое поле (calendar.datefield, счет для местоположения 1, счет для местоположения 2, счет для местоположения 3 ...)

Для подсчета я выполнил ЛЕВУЮ ВНЕШНЕЕ СОЕДИНЕНИЕ подзапроса, который прямо присоединен к календарю. Это заставляет подзапрос возвращать счетчик для каждого отдельного дня (сгруппированный по каждому календарному дню), и это остается левым и внешним (как упоминалось несколько секунд назад) к полю calendar.date, который затем фильтруется предложением where между датами a и b. .

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

    select calendar.datefield, (ifnull(tOHS.Count,0)+ifnull(tOMSS.Count,0)+ifnull(tOMSN.Count,0)) as 'Total', ifnull(tOHS.Count,0) as 'OHS', ifnull(tOMSS.Count,0) as 'OMS-S', ifnull(tOMSN.Count,0) as 'OMS-N'
from calendar

LEFT OUTER JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as 'Date'
        From workorders Right Join
      calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') =
          calendar.datefield)
    Where School = 'OHS'
    Group By calendar.datefield,workorders.school
    ) tOHS
 on calendar.datefield = tOHS.Date

 LEFT OUTER JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as 'Date'
        From workorders Right Join
      calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') =
          calendar.datefield)
    Where School = 'OMS-S'
    Group By calendar.datefield,workorders.school
    ) tOMSS
 on calendar.datefield = tOMSS.Date

 LEFT OUTER JOIN 
(
Select workorders.school, Count(workorders.dateSubmitted) As 'Count', FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') as 'Date'
        From workorders Right Join
      calendar On (FROM_UNIXTIME(workorders.dateSubmitted, '%Y-%m-%d') =
          calendar.datefield)
    Where School = 'OMS-N'
    Group By calendar.datefield,workorders.school
    ) tOMSN
 on calendar.datefield = tOMSN.Date


 WHERE calendar.datefield Between '2011-08-30' And date_format(now(), '%Y-%m-%d')

Возвращает даты в диапазоне от a до b и дает общее количество для 3 зданий и каждого здания. У меня есть 4 здания, но легко добавить столько, сколько вы хотите, скопировав и вставив каждое LEFT OUTER JOIN вниз в предложение on, изменив переменные и добавив новый выбор для этого количества.

Ух ты, что это может запутать. надеюсь, это когда-нибудь кому-нибудь поможет: -)

Бил

...