2016-08-26 3 views
0

Прежде всего, я новичок в MySQL, и я полностью извиняюсь, если я попрошу что-то, на что уже было ответили в разных «условиях». Я искал решение для этого уже более недели, и я не смог найти его, возможно, потому, что я не использую правильные ключевые слова. Пожалуйста, медведь со мной и моим невежеством в этом смысле :)MySQL Query из одной таблицы - выберите одно и то же поле дважды

У меня есть таблица со следующими полями:

ID   int(11)  NO  PRI  auto_increment 
Building  int(11)  YES MUL  
CounterNo  int(11)  YES MUL  
ReadingDate datetime  YES    
StartMeter int(11)  YES    
EndMeter  int(11)  YES    
CostKw  decimal(10,6) YES    
Multiplier smallint(3) YES 

Я хочу, чтобы сделать запрос, который я хотел бы использовать для заполнения сравнения линейного графика, что вернет следующее:

Building | Cons1 | Cons2 | Month 
1   1year ybefore Month 

Если название месяца будет затем использоваться для заполнения оси X, и Cons1 будет расход для каждого здания, за каждый месяц в прошлом году, в то время как Cons2 бы потребление для каждого здания за каждый месяц в году для е.

Я уже играю, и до сих пор я получил к следующему:

SELECT Building, 
         CASE 
      WHEN ReadingDate >= DATE_SUB(NOW(), INTERVAL 1 YEAR) 
      THEN (EndMeter - StartMeter) 
      ELSE NULL 
     END 
    AS 'Cons1', 
      CASE 
      WHEN ReadingDate BETWEEN DATE_SUB(NOW(), INTERVAL 2 Year) AND DATE_SUB(NOW(), INTERVAL 1 Year) 
      THEN (EndMeter - StartMeter) 
      ELSE NULL 
     END 
    AS 'Cons2', 
CONCAT(
     MONTHNAME (
      tblElectricReadings.ReadingDate 
     ) 
    ) AS MonthRecorded 
FROM tblElectricReadings 
WHERE ReadingDate >= DATE_SUB(NOW(), INTERVAL 2 YEAR) 
ORDER BY ReadingDate 

Это дает результаты, я хочу, но это не «консолидировать» (и опять же, извините если я использую неправильные слова здесь) Cons1 и Cons2 вместе, но вместо этого ставит нулевое значение в оба поля, создавая двойные записи, которые мне нужны. В принципе, запрос работает нормально, но это не тот результат, который я хочу. Я бы хотел, чтобы оба Cons1 и Cons2 были заполнены соответствующим потреблением в соответствии с каждым месяцем, чтобы я мог заполнить линейный график (с 2 строками, 1 для Cons1 и другой для Cons2) соответственно.

Надеюсь, я был достаточно ясен, если не простите меня и скажите, нужна ли вам дополнительная информация.

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

РЕДАКТИРОВАТЬ: ответить Paul - для каждого здания есть только 1 запись за каждый месяц, поэтому это не проблема. Но спасибо, что заметили это! Также спасибо миллиону xQbert - ваш ответ именно то, что я искал :) Спасибо за ваше время.

+1

использование max и группы по. похоже на: http://stackoverflow.com/questions/3263126/merging-two-rows-to-one-while-replacing-null-values ​​ – xQbert

+0

Если в течение одного месяца есть несколько записей - какой из них вы хотите взять? –

ответ

0

Поскольку мы знаем, что каждая запись будет иметь нулевое значение с использованием max (или min), исключает значения нулевой записи и объединяет результаты в одну строку/запись.

SELECT Building, 
     max(CASE 
      WHEN ReadingDate >= DATE_SUB(NOW(), INTERVAL 1 YEAR) 
      THEN (EndMeter - StartMeter) 
      ELSE NULL 
     END) 
    AS 'Cons1', 
     max(CASE 
      WHEN ReadingDate BETWEEN DATE_SUB(NOW(), INTERVAL 2 Year) AND DATE_SUB(NOW(), INTERVAL 1 Year) 
      THEN (EndMeter - StartMeter) 
      ELSE NULL 
     END) 
    AS 'Cons2', 
CONCAT(
     MONTHNAME (
      tblElectricReadings.ReadingDate 
     ) 
    ) AS MonthRecorded 
FROM tblElectricReadings 
WHERE ReadingDate >= DATE_SUB(NOW(), INTERVAL 2 YEAR) 
GROUP BY Building, CONCAT(MONTHNAME(tblElectricReadings.ReadingDate)) 
ORDER BY ReadingDate 
Смежные вопросы