2016-09-02 16 views
2

これはおそらくmysqlとの別の単純な左右の結合を持っています...しかしこれは少し複雑で、これまで私が見たすべての例は見えません私が持っているものと仕事をする。私はこれがちょっと混乱している場合はお詫び申し上げます...私は本当にそれを綴ってみるつもりです。基本的に、SAMEテーブルからデータを選択する3つのSELECTクエリがあります。それは私が取得する必要があるときは、しかし、これは空白にすることができ、アイテム名 -MySQLサブクエリはGroup By節を使って同じテーブルに...

  • 項目」:私は、テーブルにとの対話てるだけ4つのフィールドがある「ORDER_ITEMSを」と呼ばれるがあります:
  • Essential_Type」 - 代替アイテム名
  • QTY」 - 特定の順序で並べられたその項目の発注されているどのように多くのです。これらの行のためのQTYがNullであるが、その行が '1
  • としてカウントする必要があるため、今、項目が空白の場合、私はCOUNT(Essential_Type)代わりにSUM(QTY)に必要作成 - オーダー作成の日時

クエリ#1:これは私の項目の名前を取得し、どのように多くは販売された

SELECT 
IF(Item='', Essential_Type, Item) AS Name, 
IF(Item='', COUNT(Essential_Type), SUM(QTY)) AS Qty 
FROM Order_Items 
GROUP BY Item, Essential_Type 
ORDER BY Qty 

戻り値:

NAME   QTY 
--------------------- 
8x10   2345 
16x20   340 

クエリ#2:これは私に販売された各項目の数を取得し、今年

SELECT 
IF(Item='', Essential_Type, Item) AS Name, 
IF(Item='', COUNT(Essential_Type), SUM(QTY)) AS ThisYear 
FROM Order_Items 
WHERE year(Created)=2016 
GROUP BY Item, Essential_Type 

戻り値:

Name   ThisYear 
----------------------------- 
8x10   120 
16x20   25 

クエリ#3:ORDER_ITEMSは、例えば次のようになりますのであれば

Name   LastYear 
----------------------------- 
8x10   500 
16x20   30 


:これは私の昨年

SELECT 
IF(Item='', Essential_Type, Item) AS Name, 
IF(Item='', COUNT(Essential_Type), SUM(QTY)) AS LastYear 
FROM Order_Items 
WHERE year(Created)=2015 
GROUP BY Item, Essential_Type 

戻り値を売却し、各項目の数を取得します。

Item   Essential_Type   QTY  Created 
--------------------------------------------------------------------- 
8x10         3   2016-09-01 
8x10         1   2015-07-21 
       16x20     NULL  2015-08-12 
       16x20     NULL  2016-05-21 

JOINを使用して、これらの3つの複雑なSELECTを1つのSELECTステートメントに結合するにはどうすればよいですか?基本的にはその最終的な結果は、(上記のサンプルテーブルに基づいて)次のようになります。読書や任意の潜在的な助けのため

Name   QTY   ThisYear  LastYear 
----------------------------------------------------------- 
8x10   4   3    1 
16x20   2   1    1 

ありがとう!

答えて

1

アグリゲーションのロジックが厄介なことがわかりました(私はクエリがUNION ALLを使って簡単になるだろうと考えています)。しかし、条件付き集計を使用してクエリを拡張することができます。

SELECT (CASE WHEN Item = '' THEN Essential_Type ELSE Item END) AS Name, 
     (CASE WHEN Item = '' THEN COUNT(Essential_Type) ELSE SUM(QTY) END) AS Qty, 
     (CASE WHEN Item = '' 
      THEN COUNT(CASE WHEN YEAR(Created) = 2015 THEN Essential_Type END) 
      ELSE SUM(CASE WHEN YEAR(Created) = 2015 THEN QTY END) 
     END) as yr2015, 
     (CASE WHEN Item = '' 
      THEN COUNT(CASE WHEN YEAR(Created) = 2016 THEN Essential_Type END) 
      ELSE SUM(CASE WHEN YEAR(Created) = 2016 THEN QTY END) 
     END) as yr2016 
FROM Order_Items 
GROUP BY Item, Essential_Type 
ORDER BY Qty; 
+0

これは完全に機能します。はい、この特定のテーブルのデータは実際には効率が悪いので混乱しますが、データを並べ替えることなくそのまま使用しなければなりません。答えをありがとう、それはかなり助けます。 –

関連する問題