一連のレコードがある場合
name amount Code
Dave 2 1234
Dave 3 1234
Daves 4 1234
これをコードと名前に基づいてグループ化したいのですが、最後の行の名前にタイプミスがあるため、グループ化できません。
これらを次のようにグループ化する最良の方法は何でしょう:
Dave/Daves 9 1234
原則として、データが間違っている場合は、データを修正する必要があります。
ただし、とにかくレポートを実行したい場合は、グループ化する別の基準を考え出すことができます。たとえば、LEFT(Name, 4) は名前の最初の 4 文字でグループ化を実行します。
CASE ステートメントをメソッドと見なすこともできます (CASE WHEN name = 'Daves' THEN 'Dave' ELSE name) が、特にこのメソッドを他の目的で使用することを提案している場合は、このメソッドが本当に好きではありません。ワンオフレポート。
それが回避策である場合は、試してください
SELECT cname, SUM(amount)
FROM (
SELECT CASE WHEN NAME = 'Daves' THEN 'Dave' ELSE name END AS cname, amount
FROM mytable
)
GROUP BY cname
この if course は、この正確なケースのみを処理します。
MySQL の場合:
select
group_concat(distinct name separator '/'),
sum(amount),
code
from
T
group by
code
MSSQL 2005 以降では、group_concat() を .NET カスタム集計として実装できます。
タイプミスを修正しますか?それ以外の場合、名前でグループ化すると、新しいグループが作成されます。
データを「回避」する方法を考案するのではなく、データを修正することが最優先事項であるべきです。
また、データにこの 1 つのタイプミスがある場合、コードにうまく適合しないさらに厄介なデータがある (または将来のある時点である) 可能性が高いことに注意してください。データのクリーンさに焦点を当てる必要があるときに、それに対処するための「回避策」をますます考案する必要があります。
name フィールドがキーであると想定される場合、Dave と Daves は 2 つの異なるアイテムであり、異なるグループに分けられる必要があると想定する必要があります。ただし、タイプミスの場合は、他の人が示唆しているように、データを修正してください。
自由形式で入力されたテキスト フィールドでグループ化すると、常に問題が発生します。データ入力は決して 100% ではありません。
私にとっては、それがキー フィールドである場合はコードだけでグループ化し、グループ化から名前を除外する方が理にかなっています。