2016-05-12 7 views
0

残りのクエリで誰かが助けてくれますか?顧客が同じ日に物を買った行を返す

このクエリは、私の会社のすべての売上から、Customer、AdressNr、Date、Employee、Article、ActivityNr を提供します。

SELECT ad.Name + ' ' + ad.Vorname AS Customer, 
pa.Kunde AS CustomerNr, 
CONVERT(VARCHAR(10),p.datum,126) AS Date, 
(SELECT a.name + ' ' + a.Vorname AS Name FROM PRO_Mitarbeiter m LEFT JOIN ADR_Adressen a ON a.AdressNrADR=m.AdressNrADR WHERE m.MitNrPRO = l.MitNrPRO) as Employee, 
p.Artikel_1 AS Article, 
l.AufgabenNrCRM AS OrderNr 
FROM ZUS_Therapie_Positionen p 
INNER JOIN CRM_AufgabenLink l ON l.AufgabenNrCRM = p.Id_Aktivitaet 
INNER JOIN CRM_Aufgaben ab ON ab.AufgabenNrCRM = p.Id_Aktivitaet 
INNER JOIN PRO_Auftraege pa ON pa.AuftragNrPRO = ab.AuftragNrPRO 
INNER JOIN ADR_Adressen ad ON ad.AdressNrADR = pa.Kunde 
INNER JOIN ADR_GruppenLink gl ON gl.AdressNrADR = ad.AdressNrADR 
INNER JOIN ADR_Gruppen g ON g.GruppeADR = gl.GruppeADR 
WHERE l.MitNrPRO != 0 
GROUP BY l.AufgabenNrCRM,ad.Name,ad.Vorname,pa.Kunde,p.datum,p.Artikel_1,l.MitNrPRO 
ORDER BY pa.Kunde,p.datum,l.AufgabenNrCRM 

私の目標は、これをフィルタリングして、顧客が購入した行だけを戻し、同じ日に1つのものを得ることです。顧客が同じ日に同じ記事を2回購入したかどうかは関係ありません。これもまた見て欲しい。

SQLフィドルを書くのは複雑ですが、この写真では私の目標は何かを見ることができます。私は左側にあるXですべての列を取り除きたいと思います。サークルで保存したいと思います。

enter image description here

+0

上記のクエリのサンプル結果と取得したい結果を入力してください。 – Alex

+1

[count> 1のレコードを検索するためのSQLクエリの可能な複製](http://stackoverflow.com/questions/7151401/sql-query-finding-records-where-count-1) –

+0

1)あなたは'GROUP BY'ではなく、集合関数はありません。 'DISTINCT'が本当に必要なのでしょうか(同じ複数の行がある場合、または行がすでに一意であり、必要がない場合)2〜3つのカラム、特に別々のテーブルからのカラムの場合、おそらく1つ以上のテーブルをあらかじめ集計するなど、何か他のことを試してみてください。 –

答えて

0

私はドイツ語を話さないように、私はあなたのSQLにこれを具体的に対象としません。しかし、あなた自身のスクリプトに適用できるはずの同様の例については、次の疑似コードを参照してください。上記のスクリプトで

SELECT C.CustomerName, O.OrderDate, O.OrderNumber 
FROM CUSTOMER C 
JOIN ORDERS O ON O.Customer_ID = C.Customer_ID 
JOIN 
    (SELECT Customer_ID, OrderDate 
    FROM ORDERS 
    GROUP BY Customer_ID, OrderDate 
    HAVING COUNT(*) > 1) SRC 
     ON SRC.Customer_ID = O.Customer_ID AND SRC.OrderDate = O.OrderDate 

、最後のクエリ(サブクエリ)が唯一の顧客が特定の日に複数のオーダーを持っていた結果を返します。これをメインクエリに参加させることで、OPで尋ねられた結果が効果的に生成されます。

編集1: 以下のコメントに関しては、私は本当にちょうどここに何が起こっているのか理解しようと、あなたのデータモデルの上に行くと、自分でそれを修正お勧めします。しかし、上記の独自のスクリプトを使用するだけで、簡単に解決することはできますが、最適な解決策はありません。これはパフォーマンス面で悲惨なことではありませんが、明らかに最もクリーンで効果的な方法ではありません。しかし、それは動作するはずです:

;WITH CTE AS (SELECT ad.Name + ' ' + ad.Vorname AS Customer, 
    pa.Kunde AS CustomerNr, 
    CONVERT(VARCHAR(10),p.datum,126) AS [Date], 
    (SELECT a.name + ' ' + a.Vorname AS Name FROM PRO_Mitarbeiter m LEFT JOIN ADR_Adressen a ON a.AdressNrADR=m.AdressNrADR WHERE m.MitNrPRO = l.MitNrPRO) as Employee, 
    p.Artikel_1 AS Article, 
    l.AufgabenNrCRM AS OrderNr 
    FROM ZUS_Therapie_Positionen p 
    INNER JOIN CRM_AufgabenLink l ON l.AufgabenNrCRM = p.Id_Aktivitaet 
    INNER JOIN CRM_Aufgaben ab ON ab.AufgabenNrCRM = p.Id_Aktivitaet 
    INNER JOIN PRO_Auftraege pa ON pa.AuftragNrPRO = ab.AuftragNrPRO 
    INNER JOIN ADR_Adressen ad ON ad.AdressNrADR = pa.Kunde 
    INNER JOIN ADR_GruppenLink gl ON gl.AdressNrADR = ad.AdressNrADR 
    INNER JOIN ADR_Gruppen g ON g.GruppeADR = gl.GruppeADR 
    WHERE l.MitNrPRO != 0 
    GROUP BY l.AufgabenNrCRM,ad.Name,ad.Vorname,pa.Kunde,p.datum,p.Artikel_1,l.MitNrPRO 
    ORDER BY pa.Kunde,p.datum,l.AufgabenNrCRM) 
SELECT C.* 
FROM CTE C 
JOIN (Select CustomerNr, [Date] 
    FROM CTE B 
    GROUP BY CustomerNr, [Date] 
    HAVING COUNT(*) > 1) SRC 
     ON SRC.CustomerNr = C.CustomerNr AND SRC.[Date] = C.[Date] 

これは直接動作するはずです。しかし、私が言ったように、これは基本的にすべてのセットを2回フェッチするという醜い回避策です。サブクエリを必要最小限のテーブルだけに限定するのではなく、あなたの選択。 :)

+0

ご協力いただきありがとうございます。私の問題は、私のクエリには非常に多くの結合が含まれていることと、いくつかのステートメントと私はすべての結合を使用しなければならない場合、私は知りません。 – user2210516

+0

私は今試してみましたが、まったく動作しません:(それはとにかく結果が戻ってきます – user2210516

+0

私のポストの編集されたセクションをチェックして、直接働くべき回避策を探してください。必要なデータだけを使用するようにクエリを最適化するために、より多くの宿題をすることをお勧めします:) – Kahn

0

それも試してみました。私はまた、できるだけシンプルにしようとする新しいクエリを作成しました。どちらもうまくいきません。それでも私は単一の値を返します。

SELECT p.Datum,a.AufgabenNrCRM,auf.Kunde FROM CRM_Aufgaben a 
LEFT JOIN ZUS_Therapie_Positionen p ON p.Id_Aktivitaet = a.AufgabenNrCRM 
LEFT JOIN PRO_Auftraege auf ON auf.AuftragNrPRO = a.AuftragNrPRO 
     LEFT JOIN 
     (SELECT pa.Datum,au.Kunde FROM CRM_Aufgaben aa 
     LEFT JOIN ZUS_Therapie_Positionen pa ON pa.Id_Aktivitaet = aa.AufgabenNrCRM 
     LEFT JOIN PRO_Auftraege au ON au.AuftragNrPRO = aa.AuftragNrPRO 
     GROUP BY pa.Datum,au.Kunde 
     HAVING COUNT(*) > 1) SRC 
ON SRC.Kunde = auf.Kunde 
WHERE p.datum IS NOT NULL 
GROUP BY p.Datum,a.AufgabenNrCRM,auf.Kunde 
ORDER BY auf.Kunde,p.Datum 
関連する問題