0

これが私の質問です: group by で集計関数を使用してレコードの整合性を維持するにはどうすればよいですか?

さらに説明するために、ここに例を示します。

次の列を持つテーブルがあります: (「順序」テーブルと考えてください)

Customer_Summary (first 10 char of name + first 10 char of address)
Customer_Name
Customer_Address
Customer_Postal Code
Order_weekday

「注文」ごとに 1 つの行があるため、顧客名、住所、概要が同じ行が多数あります。

私がやりたいことは、顧客の名前、住所、郵便番号、および各平日の注文数を、顧客の概要別にグループ化して表示することです。

したがって、データは次のようになります。

Summary             | Name        | Address    | PCode | Monday | Tuesday | Wednesday | Thursday | Friday

test custntest addre|test custname|test address|123456 | 1      | 1       | 1         | 1        | 1

似たような顧客概要のレコードをグループ化したいだけですが、明らかに 1 つの名前、住所、および郵便番号を表示したいと考えています。現時点では min() を使用しているため、クエリは次のようになります。

SELECT Customer_Summary, min(customer_name), min(customer_address), min(customer_postal_code) 
FROM Order
Group by customer_summary

必要ないと思ったので、平日のロジックは省略しました。

私の問題はこれです - 同じ顧客概要を持つこれらの顧客の一部は、異なる住所と郵便番号を持っています。

したがって、次のような 2 人の顧客がいるとします。

test custntest addre|test custname |test address |323456|

test custntest addre|test custname2|test address2|123456|

group by を使用すると、クエリは次のように返されます。

test custntest addre|test custname |test address |123456|

min を使用しているため、すべてのフィールドの最小値が得られますが、必ずしも同じレコードからではありません。そのため、ここでレコードの整合性が失われました。クエリによって返された住所と名前が郵便番号と正しく一致しません。

では、group by 句を使用するときに、グループ化されていないフィールドでデータの整合性を維持するにはどうすればよいでしょうか?

うまくいけば、私はそれを十分に明確に説明しました。助けてくれてありがとう。

編集:解決しました。みんな、ありがとう!

4

2 に答える 2

3

ROW_NUMBER代わりにいつでも使用できますGROUP BY

WITH A AS (
    SELECT Customer_Summary, customer_name, customer_address, customer_postal_code,
        ROW_NUMBER() OVER (PARTITION BY Customer_Summary ORDER BY customer_name, customer_address) AS rn
    FROM Order
)
SELECT Customer_Summary, customer_name, customer_address, customer_postal_code
FROM A
WHERE rn = 1

次に、ORDER BY 句で使用する顧客を自由に注文できます。現在、私はそれらを名前で注文し、次に住所で注文しています。

編集:

私のソリューションは、あなたが求めたことを行います。しかし、私は確かに他の人に同意します:データベース構造を変更することが許可されている場合、これは良い考えです...あなたはそうではありません(あなたのコメントを見ました)。では、ROW_NUMBER() は良い方法です。

于 2012-04-10T12:41:31.897 に答える
3

構造を再考する必要があると思います。

理想的にはCustomer、一意の ID を持つテーブルが必要です。次に、その一意の ID をOrderテーブルで使用します。次に、使用している奇妙な「最初の 10 文字」メソッドは必要ありません。Customer代わりに、テーブルの一意の ID でグループ化するだけです。

さらに、複数の行(自宅の住所、配送先住所、請求先住所などとしてマークされたフィールドを含む) で、各住所を顧客に関連付ける住所用の個別のテーブルを作成することもできます。

このようにして、顧客情報を住所情報および注文情報から分離します。顧客が名前 (結婚) または住所 (引っ越し) を変更した場合に、データが壊れないようにします。データ自体ではなく、すべてが ID によって関連付けられます。

[この関係は外部キーとして知られています。]

于 2012-04-10T12:42:41.027 に答える