2016-11-01 48 views
0

現在、この照会を使用して顧客イベントをトリガーしています。しかし、同じ顧客が別のWorkOrderIdを割り当てられていることがあります。これは私の主要なフィルターです。そこで、フィルタを拡張して、一意のCustomerNameも探すようにします。言い換えると、クエリが同じCustomerNameを持つ2つの行を返す場合、2行目をすべて除外します。SQL照会から重複を削除する

SELECT CustomerName, JobId, Email, CCEmail, WorkOrderId AS id 
FROM dbo.vwWorkOrderDetail 
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1 
ORDER BY WorkOrderId DESC 

DISTINCTを使用しようとしましたが、別の行に同じCustomerNameを含む結果が得られます。すべてのWHERE条件に合格した結果を返し、一意のCustomerNameを持つ行のみを表示するようにこのクエリを設定するにはどうすればよいですか?

+0

あなたの質問は不完全です。 2つのworkOrderIdがあるという事実について、あなたは何をしたいですか? –

+0

このクエリの結果で常に1行またはゼロ行が生成されるようにしたいですか? – JohnH

答えて

1

WorkOrderIdを含める限り、DISTINCTは何も行いません。 DISTINCTは、SELECTで指定されたすべての列に同じ情報が含まれている場合にのみ重複を排除できます。だから、あなたがこれを行う必要があるだろう、重複した顧客を排除するためにDISTINCTを使用する:

SELECT DISTINCT CustomerName, JobId, Email, CCEmail 
FROM dbo.vwWorkOrderDetail 
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1 
ORDER BY WorkOrderId DESC 

WorkOrderIdを維持するために、このアプローチする最良の方法は、基になるテーブルに基づいて新しいビューを作成することです。あなたが提示したいWorkOrderIdのWorkOrderIdを決定する必要があります。通常これは最高のIDです。あなたが必要とするのは、詳細ではなくWorkOrderIdだけです。実際これはかなり簡単です。以下のコードは、CustomerIdが作業指示に直接結びついていると仮定した単純な例です。これに本当に答えるには、vwWorkOrderDetailのコードを提供する必要があります。

SELECT CustomerName, JobId, Email, CCEmail, (SELECT MAX(WorkOrderId) FROM WorkOrders WHERE CustomerID = Customers.CustomerID) AS WorkOrderID 
FROM Customers 
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1 
ORDER BY WorkOrderId DESC 
+0

Gotcha。さて、私はDBビューのデザインレイアウトを見て、CustomerIDは 'Customer'テーブルを介して直接接続されています。 CustomerIDとCustomerNameが 'Customer'の唯一の値で、電子メールデータが 'Contact'テーブルにあるようです。これは残念なことに8つ以上のテーブルを結合する複雑なビューです。私は洞察と応答に感謝し、ちょうど私が質問の他の側面に答えるためのSQL知識を持っているかどうか分からない:( – user3010456

+0

あなたが助けようとすることができるビューコードを掲示すれば。 1つだけが必要で、WorkOrderId以外の作業オーダーの詳細が必要かどうかを返すことができます。この作業を実行するにはさまざまな方法がありますが、適切なものを選択することは良い要求を受け取るかどうかによって異なります。 – JamieSee

0
SELECT CustomerName, JobId, Email, CCEmail, max(WorkOrderId) AS id 
FROM dbo.vwWorkOrderDetail 
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1 
GROUP BY CustomerName, JobId, Email, CCEmail 
+0

応答!結果は依然として重複したCustomerName結果を示します。重複した名前の結果も、そのCustomerNameの最初のレコードとは異なるWorkOrderId、JobId(またはその両方)を持ちます。だから、残っている5%を、私が持っている最良の選択肢であるCustomerNameでフィルタリングしようとしています。 – user3010456

関連する問題