2017-01-31 21 views
0

私は、営業担当者のために「リーダーボード」を作成するために使用しているサブクエリに比較的複雑なクエリを使用しています。問題は、プライマリデータがSale_Dateでフィルタリングされているのに対し、Install_Dateでフィルタリングされる列のうちの1つ(Installs列のみ)が必要なことです。私はMySQLワークベンチとサードパーティのビジネスインテリジェンスプラットフォームを使用して、データを提示可能な方法で出力しています。以下は私が現在行っていることの簡略化されたバージョンですが、明らかにうまくいかない、または私が望むものを私に与えてくれません。MySQLテーブルクエリにカラムを追加する

select `Rep`, `Sales`, `Passed Credit`, `Sales Scheduled`, Installs 
from 
    (select Rep_Name as `Rep`, count(*) as `Sales`..., count(...) as `Sales Scheduled` 
     from ss.customers 
      left join ss.users 
       on customers.rep_id = users.id 
     where Sale_Date between curdate() - interval 6 day and curdate() 
     group by Rep_Name with rollup) cust, 
    (select Rep_Name, count(*) as `Installs` 
     from ss.customers 
      left join ss.installs 
       on customers.id = installs.id 
      left join ss.users 
       on customers.rep_id = users.id 
     where Install_Date between curdate() - interval 6 day and curdate() 
     group by Rep_Name) inst 
order by `Sales` desc, `Passed Credit` desc, ..., `Installs` desc 

私が手出力は、第1表「CUST」内のすべてのフィールドに対して正しいですが、私の担当者のすべてが最初はその1または20かクエリの後半に返されるカウント「インストール」と表示。

このような何かを返して:

Rep ----- Sales ----- Passed Credit ----- Sales Scheduled ----- Installs 
John | 10  |   7   |   6   |  5 
Mike | 8  |   7   |   6   |  5 
Trey | 8  |   6   |   4   |  5 
Drew | 6  |   3   |   3   |  5 
Angel | 3  |   2   |   4   |  5 
Total | 35  |   25  |   23   |  22 

インストール表には、この週何の販売を持っていない一部の人々が含まれないが、彼らはまた、彼らはあるべき、ここに表示されていません。私が参加し、労働組合、そしてどこ文のいくつかのクレイジーな組み合わせを試してみた

Rep ----- Sales ----- Passed Credit ----- Sales Scheduled ----- Installs 
John | 10  |   7   |   6   |  5 
Mike | 8  |   7   |   6   |  9 
Trey | 8  |   6   |   4   |  4 
Drew | 6  |   3   |   3   |  4 
Angel | 3  |   2   |   4   |  0 
Tracy | 0  |   0   |   0   |  3 
Diego | 0  |   0   |   0   |  1 
Total | 35  |   25  |   23   |  26 

:理想的には、これは表がどのように見えるかです。これを得る方法に関する他のアイデア?どんな助けもありがとう!

アップデート私は左結合を使用することにより、誤って表示「をインストールします」欄の私の問題を解決することができたspencer7593に1つの 感謝を。現在は週に0回の販売で担当者を表示する作業を行っていますが、インストールは過去数週間で完了しています。私たちのCRMデータベースが異なるものを表す別のテーブルで同じ名前の複数の列を台無しです知っ

Customers - rep_id, Sale_Date, id, Passed_Credit, Sale_Scheduled 
Users - id (which is customers.rep_id), Rep_Name, Rep_Office_Location 
Installs - id (which is customers.id), Install_Date, Install_Status 

:私は前に含めるのを忘れていることを記載されているテーブルに対して

必要な予選フィールド。私はそれをデザインしていないし、それは私が平均時間のために生きなければならないものです。

答えて

1

クエリでは、2つのインラインビューのデカルト積、custおよびinstが生成されています。

Rep_Nameに「一致」したいと思います。そのコンマ結合演算子をLEFT JOINキーワードに置き換え、ON句をに一致させてinst.Rep_Nameに追加します。 WITH ROLLUPを返信しているので、それをinstの合計行と照合したいでしょうか?

ほとんどの列参照は修飾されていないため、どの表にどの列が含まれているかわかりません。 (Rep_NameSale_Datess.customersまたはss.usersから来ている?)私はあなたが将来のリーダーへの支援として、すべての列参照を修飾し、列がテーブルに追加された後にするとき、「あいまいな列」エラーがアップトリミング避けることをお勧めします。

あなたがいないSalesとのものも含め、すべてのRep_Nameを返すようにしたい場合は、あなたがSale_Dateusers表の列への参照がある場合(ON句にWHERE句で条件を移動する必要があるかもしれません。)

表はどの列が含まれているかについて、いくつかの推測を作り、そしてRep_Nameは、このような何かnullではないと仮定:

SELECT IFNULL(cust.`Rep_Name`,'Total') AS `Rep` 
    , cust.`Sales` 
    , cust.`Passed Credit` 
    , cust.`Sales Scheduled` 
    , inst.`Installs` 
    FROM (SELECT cc.`Rep_Name` AS `Rep_Name` 
       , COUNT(cu.id) AS `Sales` 
       , ... 
       , COUNT(...)  AS `Sales Scheduled` 
      FROM ss.customers cc 
      LEFT 
      JOIN ss.users cu 
      ON cu.`id` = cc.`rep_id` 
      AND cu.`Sale_Date` BETWEEN CURDATE() - INTERVAL 6 DAY AND CURDATE() 
      GROUP BY cc.`Rep_Name` 
      WITH ROLLUP 
     ) cust 
    LEFT 
    JOIN (SELECT ic.`Rep_Name` AS `Rep_Name` 
       , COUNT(ii.id) AS `Installs` 
      FROM ss.customers ic 
      LEFT 
      JOIN ss.installs ii 
      ON ii.`id` = ic.`id` 
      AND ii.`Install_Date` BETWEEN CURDATE() - INTERVAL 6 DAY AND CURDATE() 
      GROUP BY ic.`Rep_Name` 
      WITH ROLLUP 
     ) inst 
    ON inst.`Rep_Name` <=> cust.`Rep_Name` 
    ORDER 
    BY cust.`Rep_Name` IS NOT NULL DESC 
     , cust.`Sales` DESC 
     , cust.`Passed Credit` DESC 
     , ... 
     , inst.`Installs` DESC 

注:Rep_Nameだろう「マッチ」WITH ROLLUPのNULL値を持つ任意の行総行最後の合計行が必要なように見えるので、ORDER BYに式を追加してその行を最後にすることができます。


フォロー:

駆動表を作成し、販売のための「ゼロ」のカウントを取得するにはあなたにすべてのRep_Nameのリストを与えると、外側はあなたに販売を与え、テーブルに参加します。別のテーブル名に

を使ってデモンストレーションとして

は、任意のマッチング「売上」と一緒にすべて営業担当者のリストを取得するにはすべて営業担当者

SELECT r.rep_id, r.rep_name 
    FROM all_reps r 
    ORDER BY r.id 

のリストを取得し、外部結合を使用できます。一致の条件は、外部結合のON句であり、WHERE句ではないことに注意してください。売上高に任意の「マッチング」の行を持っていない担当者のために

SELECT r.rep_id 
     , r.rep_name 
     , s.sale_date 
    FROM all_reps r 
    LEFT 
    JOIN sales s 
    ON s.rep_id = r.rep_id 
    AND s.sale_date >= TRUNC(NOW()) - INTERVAL 6 DAY 
    ORDER BY r.rep_id, s.sale_date 

、我々はrからの列と行が返されます。これらの行では、sの列はNULLになります。

s.sale_dateの述語(条件)をWHERE句に移動すると、NULL値がs.sale_dateのすべての行が除外されることに注意してください。そして、それは結合の "外側"を否定し、それを内部結合と同等にします。

+0

あなたは素晴らしいです。特定のテーブルに列を限定しないようにして、推測の仕事をあなたに任せてくれたことを謝罪します。しかし、あなたは実際にそれらの大部分を正しいものにすることができました。まもなく私の元の記事をここで更新します。左の結合はまさに私が必要としたものでした。私はまだ、その週の売上0で、担当者にテーブルを作成させる作業をしています。 sale_dateはss.usersの参照列ではないため、現在、結合の結果を出力の下に追加するための組合を試しています。もう少し私はあなたとポストを更新します。 – Andrew

+0

Salesの「ゼロ」カウントを取得するには、Driving TableをすべてのRep_Nameを持つテーブルにし、関連するSalesを持つテーブルに対してLEFT JOINを実行します。販売日の述語(条件)を 'WHERE'節ではなく' ON'節に置きます。 – spencer7593

関連する問題