C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQL文について

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■85494 / inTopicNo.1)  SQL文について
  
□投稿者/ 耳痛 (1回)-(2017/10/30(Mon) 14:37:30)

分類:[VB.NET/VB2005 以降] 

SQLのSELECT文にSELECT文を入れる場合で分からないところがあるのですが
よろしくお願いいたします。

例えば、売上データに条件に合うデータが何件あるかを1つのSQL文にすると
下記(例1)のようにすればうまくできたのですが
同商品コードが3件あったとして、3件とも同じ単価の場合は「○」を
違う単価が含まれる場合は「×」としたい場合がうまくいきません。(例2)

私の考えとしては、商品コードと単価でGROUP BY して、
その件数が1件の場合は「○」、そうでない場合は「×」とすればいいかと思ったのですが
エラーでうまくいきませんでしが。
そもそもの考え方がまずいのでしょうか?

(例1)
sql1 = "SELECT COUNT(日付) "
sql1 &= "FROM 売上データ "
sql1 &= "WHERE 日付 = '2017/10/30' "

sql = "SELECT "
sql &= "日付, 商品コード, 数量, 単価, 金額, "
sql &= "(" & sql1 & ") as 件数 "
sql &= "FROM 売上データ "
sql &= "WHERE 日付 = '2017/10/30' "

(例2)
sql1 = "SELECT 商品コード, 単価 "
sql1 &= "FROM 売上データ "
sql1 &= "WHERE 日付 = '2017/10/30' "
sql1 &= "AND 商品コード = 'A0001' "
sql1 &= "GROUP BY 商品コード, 単価"

sql = "SELECT "
sql &= "日付, 商品コード, 数量, 単価, 金額, "
sql &= "CASE (" & sql1 & ") WHEN 1 THEN '○' ELSE '×' END as 単価チェック "
sql &= "FROM 売上データ "
sql &= "WHERE 日付 = '2017/10/30' "
sql &= "AND 商品コード = 'A0001' "

どこをどうすればうまくいくのでしょうか?
どうぞよろしくお願いいたします。


引用返信 編集キー/
■85495 / inTopicNo.2)  Re[1]: SQL文について
□投稿者/ PANG2 (194回)-(2017/10/30(Mon) 15:29:48)
2017/10/30(Mon) 15:35:10 編集(投稿者)
No85494 (耳痛 さん) に返信
> SQLのSELECT文にSELECT文を入れる場合で分からないところがあるのですが
> よろしくお願いいたします。

売上データに、サブクエリ(副次問い合わせ)で単価チェック列を追加する。
単価チェック列は、同一日の同一商品の単価がすべて同じなら◯、そうでないなら×とする。

と解釈して、

SELECT 
	u1.*, 
	(CASE WHEN EXISTS (
		SELECT * 
		FROM 売上データ u2 
		WHERE u2.日付 = u1.日付
		AND u2.商品コード = u1.商品コード
		AND u2.単価 != u1.単価
	) THEN '×' ELSE '◯' END) AS 単価チェック  
FROM 売上データ u1

引用返信 編集キー/
■85498 / inTopicNo.3)  Re[2]: SQL文について
□投稿者/ ???? (1回)-(2017/10/30(Mon) 16:34:02)
No85495 (PANG2 さん) に返信
> 2017/10/30(Mon) 15:35:10 編集(投稿者)

ありがとうございます!
本当にすみませんが、例が間違っていました。

単価は売上明細データにあります。
売上データと売上明細データは日付と商品コードで紐づけで大丈夫です。

その場合、WHERE句にある単価の条件のように指定してもダメですよね?
同じテーブルでしたら、単価が違っていたら...とすればいいんですね。
自分では考え付きませんでした。

恐れ入りますが、そこをどのようにしたらよいか、もう一度教えていただけないでしょうか?
申し訳ありませんが、よろしくお願いいたします。
引用返信 編集キー/
■85500 / inTopicNo.4)  Re[3]: SQL文について
□投稿者/ furu (126回)-(2017/10/30(Mon) 17:36:03)
No85498 (???? さん) に返信

PANG2さんのSQLを元にORACLEだとして

SELECT 
	u.*, 
	(CASE WHEN EXISTS (
		SELECT * 
		FROM 売上明細データ um
		WHERE um.日付 = u.日付
		AND um.商品コード = u.商品コード
		HAVING COUNT(DISTINCT um.単価) > 1
	) THEN '×' ELSE '◯' END) AS 単価チェック  
FROM 売上データ u

引用返信 編集キー/
■85504 / inTopicNo.5)  Re[4]: SQL文について
□投稿者/ 耳痛 (2回)-(2017/10/31(Tue) 10:02:31)
furuさん、PANG2さん、ありがとうございました。
furuさんのSQL文で出来ました!

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ