#2です
SQLの記述量は増えましたが、#2で提示した2つのサンプルでの結果は以下の通りです。
1)の場合 7/15 の「切り替え」は、表示外 6/1 からのものになります
受付日 切り替え 氏名 電話番号 商品コード 商品名 数量 価格
2014/04/01 山田花子 12345678 55555 魔法瓶 1 2,980
2014/05/01 30 山田花子 12345678 33333 御茶碗 1 1,280
2014/07/15 44 山田花子 12345678 22222 洗面器 1 980
2)の場合 6/1 の「御茶碗」は表示外
受付日 切り替え 氏名 電話番号 商品コード 商品名 数量 価格
2014/04/01 山田花子 12345678 55555 魔法瓶 1 2,980
2014/05/01 30 山田花子 12345678 33333 御茶碗 1 1,280
2014/06/01 31 山田花子 12345678 55555 魔法瓶 1 2,980
2014/07/15 44 山田花子 12345678 22222 御茶碗 1 1,280
テーブル名を★★と仮定します
※ 変な所で折り返し表示になるかもしれませんが、メモ帳とかにコピーしてみてください。
※ 記述の仕方はいろいろあると思いますけど・・・動いたみたいだったので
SELECT T1.受付日, T1.受付日-T2.受付日 AS 切り替え,
T1.氏名, T1.電話番号, T1.商品コード, T1.商品名, T1.数量, T1.価格 FROM
(SELECT Q1.* FROM ★★ AS Q1 INNER JOIN
(SELECT 氏名, 電話番号 FROM ★★
GROUP BY 氏名, 電話番号
HAVING Min(商品コード & 商品名)<>Max(商品コード & 商品名)
) AS Q2 ON Q1.氏名=Q2.氏名 AND Q1.電話番号=Q2.電話番号
) AS T1
LEFT JOIN
(SELECT DISTINCT Q1.受付日, Q1.氏名, Q1.電話番号 FROM ★★ AS Q1 INNER JOIN
(SELECT 氏名, 電話番号 FROM ★★
GROUP BY 氏名, 電話番号
HAVING Min(商品コード & 商品名)<>Max(商品コード & 商品名)
) AS Q2 ON Q1.氏名=Q2.氏名 AND Q1.電話番号=Q2.電話番号
) AS T2
ON T1.氏名=T2.氏名 AND T1.電話番号=T2.電話番号 AND T1.受付日>T2.受付日
WHERE T2.受付日 Is Null OR (T2.受付日=
(SELECT Max(受付日) FROM ★★ WHERE 氏名=T1.氏名 AND 電話番号=T1.電話番号 AND 受付日<T1.受付日)
AND
Exists (SELECT 1 FROM ★★ WHERE 受付日=T2.受付日 AND 氏名=T1.氏名 AND 電話番号=T1.電話番号
AND 商品コード & 商品名<>T1.商品コード & T1.商品名))
ORDER BY T1.氏名, T1.電話番号, T1.受付日;
なお、佐藤一郎、大島太陽は、処理上1レコードにしかならないので、対象外とするようにしました。
また、
> またテーブルの列は追加(集計ロジックに関係しないただの列)されていくこともあり、テーブルについては列全部をクエリーでは自動反映するとしたい。
> (わざわざその都度、追加列を指定したくない)
この部分、おそらく SELECT * FROM の * の様な記述で・・・と思われますが、
* を使った場合、「受付日」と「氏名」の間に「切り替え」を挿入する方法について、
思いつかなかったので、提示した SQL 先頭2行の所
> SELECT T1.受付日, T1.受付日-T2.受付日 AS 切り替え,
> T1.氏名, T1.電話番号, T1.商品コード, T1.商品名, T1.数量, T1.価格 FROM
部分に、追加したいフィールドがあったら、T1. を付けた記述で追加してください。
※※ 上記提示 SQL には抜けがあると思います。
例えば、
・5/1 に「御茶碗」「魔法瓶」の2つが・・・
・6/1 にも「御茶碗」「魔法瓶」の2つが・・・
この場合、6/1 の「御茶碗」「魔法瓶」は表示されます。
というのは、6/1 の「御茶碗」の表示を確認する際、5/1 に「御茶碗」以外があるか・・・
「魔法瓶」があるので、表示する様に・・・
もう1つの 6/1 の「魔法瓶」の表示を確認する際、5/1 に「魔法瓶」以外があるか・・・
「御茶碗」があるので、表示する様に・・・
つまり、1日の受付が複数の個数で、その個数が一致し、内容も一致したものが連続する場合、
表示されます。
必要であれば、考えてみますが・・・・補足ください
(補足があったとしても、回答は期待はしないでください)
※ サンプル上での動きしか見てないので、また、データ量が多くなった場合??
お礼
うおーーーすごい!すみません新幹線で出張しており、今拝見しました。 ここまで考慮してくれて恐縮です(しかもレアケースまで)。 今日中に検証してみます。 取り急ぎお礼です!
補足
このレアケースを除くと完璧に表示されています!!!!ありがとうございます!! ↓↓↓ >> というのは、6/1 の「御茶碗」の表示を確認する際、5/1 に「御茶碗」以外があるか・・・ 「魔法瓶」があるので、表示する様に・・・ もう1つの 6/1 の「魔法瓶」の表示を確認する際、5/1 に「魔法瓶」以外があるか・・・ 「御茶碗」があるので、表示する様に・・・ つまり、1日の受付が複数の個数で、その個数が一致し、内容も一致したものが連続する場合、 表示されます。 必要であれば、考えてみますが 仮に、「1日の受付が複数の個数で、その個数が一致し、内容も一致したものが連続する場合」は スイッチングをしていないので、これは連続する後ろの方は変動なしとして非表示とできるもの なのでしょうか???? むずかしいでしょうか。