2016-08-26 32 views
0

まず最初に、私はMySQLの初心者です。すでに別の「用語」で答えられているものを尋ねると、私は完全にお詫び申し上げます。私は1週間以上これを解決する方法を模索してきましたが、適切なキーワードを使用していない可能性が高いため、私はこれを思いつきませんでした。私とこの意味では自分の無知でご負担ください:)MySQLテーブルからのクエリ - 同じフィールドを2回選択する

を、私は、次のフィールドを持つテーブルがある:

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 

は、私は比較の折れ線グラフを移入するために使用するクエリを、作りたいです、それは次のように返します。Cons2は消費になりながら、月の名前は、その後、X軸を移入するために使用されるだろう、とCons1は昨年の各月の各建物のための消費となり

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

毎年各建物の毎月の予定e。私はすでに遊んでてきた、これまでのところ、私は、次のいずれかに得ている

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を一緒に使用するのではなく、いずれかのフィールドにnull値を入れて、必要なレコードを2倍にします。基本的には、クエリは正常に動作しますが、それは私が望む結果ではありません。私はCons1とCons2の両方に、毎月の関連消費量を入力したいので、折れ線グラフ(Con1とCons2の2行、1行と2行)を配置することができます。

私は十分にはっきりしていないと願っています。私に許してください、あなたにさらなる情報が必要かどうか教えてください。

ご協力いただきありがとうございます。

編集:Paulに返信する - 各建物の月ごとに1つのエントリしかないので、問題はありません。しかし、気づいてくれてありがとう!また、xQbertに100万に感謝 - あなたの答えはまさに私が探していたものです:)あなたの時間の男のためにありがとう。

+1

でmaxとgroupを使用します。同じように:http://stackoverflow.com/questions/3263126/merging-two-rows-to-one-while-replacing-null-values – xQbert

+0

1ヶ月以内に複数のエントリがある場合、どちらを取るか? –

答えて

0

各レコードがmax(またはmin)を使用してnull値を持つことがわかっているので、nullレコード値が削除され、結果が1つの行/レコードにまとめられます。

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 
関連する問題