SQLSERVER、ストアドプロシージャ、クエリ」カテゴリーアーカイブ

UnityでSQLiteの使い方

UnityでSQLiteの使い方

UnityにSQLiteを導入する
https://qiita.com/CreateVector3/items/b15dc570faed517360d4

UnityでSQLiteを扱う方法
https://qiita.com/hiroyuki7/items/5335e391c9ed397aee50

UnityでSQLite!SQLiteUnityKitに潜む4つの問題点と対応方法

UnityでSQLite!SQLiteUnityKitに潜む4つの問題点と対応方法

UnityのSQLiteUnityKitのマルチバイト問題 (。・ω・。)

https://anz-note.tumblr.com/post/91559515821/unity%E3%81%AEsqliteunitykit%E3%81%AE%E3%83%9E%E3%83%AB%E3%83%81%E3%83%90%E3%82%A4%E3%83%88%E5%95%8F%E9%A1%8C-%CF%89

SQLSERVER SELECT TOP にはできるだけORDER BYをつける

先日、サーバによってSELECT TOP 1 AA FROM T_TABLE(このときはORDERを入れていない)でWHILEで回すクエリの結果が異なることがあった。
なにが悪いのかさっぱりわからなかった。Aサーバで実行するときちんと出力されるが、Bサーバで出力すると出力件数が少ない。
メモリが足りないからとか負荷がかかったとか考えたが違った。
賢者に聞くと全件検索によるSELECTでORDERがないと出力順が変わることがあるらしい。しかも数万件の出力の場合はそれが顕著に現れるらしい。
必ずしも期待した結果になるかは不明らしいから気づかない。
続きを読む

SQLSERVER パズル63 MINの扱いが難しく理解できない、相関サブクエリ

パズル63 問題文
dataのまとまりで連続しているnumを表示したい。

MINというと結果が1つのはずだが、ある条件になると複数を出力するみたい。
その条件がよくわかっていない。>>わかった。相関サブクエリだと繰り返し実行されるために複数回実行される
MINはたいていGROUPを使っていくつかのまとまり単位で最小値を出力する。つまりまとまりの中で1つだ。
この条件に当てはまらないのは、結合した条件で、結合されていないテーブルとの条件が加わったときに
MINが複数出力されるのかもしれない。がよくわかっていないので、またいつか勉強することにする。

続きを読む

買った書籍 独習C# 新版 |Excel VBA逆引き辞典パーフェクト 第3版  |SQLアンチパターン|確かな力が身につくC#「超」入門

買った書籍 独習C# 新版 |Excel VBA逆引き辞典パーフェクト 第3版  |SQLアンチパターン|確かな力が身につくC#「超」入門

C#は会社で新しい環境の開発をすることになるかもしれず、また覚えなくては。
昔Unityで使ったけど単なる関数を作るレベルでしか使っていない。
C#の基礎だけ学んでも使えるようにはならないのでUnityがC#を使うので自宅でゲームを作ってみるか。

続きを読む

P277_SQL実践入門_前日の株価と比較して上下を示す

P277_SQL実践入門_前日の株価と比較して上下を示す
株価を前日と比較して上下同じを示す

考え方はSELECT句にSELECT句を入れて全体の出力に合わせて比較するというC言語でループを考えている人にとっては理解に苦しむSQLクエリである。
ぐるぐる回すループを使わなくてもSELECTでループみたいなことができることを示した例。

基本のテーブル

/*


日付で比較して、
*/
CREATE TABLE Stocks(
brand VARCHAR(8) NOT NULL,
sale_date DATE NOT NULL,
price INT NOT NULL,
--CONSTRAINT pk_Stocks Primary key(sale_date)
)

INSERT INTO Stocks VALUES('A鉄鋼','2008-07-01',1000),
('A鉄鋼','2008-07-04',1200),
('A鉄鋼','2008-08-12',800),
('B商社','2008-06-04',3000),
('B商社','2008-12-31',3000),
('C電気','2008-07-01',9000),
('D産業','2008-06-04',5000),
('D産業','2008-06-05',5000),
('D産業','2008-06-06',4800),
('D産業','2008-12-01',5100)

SELECT brand,sale_date,price,
	CASE SIGN(price - 
		(
		SELECT price
			FROM Stocks S1
			WHERE brand = Stocks.brand
				AND sale_date = 
					(SELECT MAX(sale_date)
						FROM Stocks S2
						WHERE	brand = Stocks.brand
							AND sale_date< Stocks.sale_date
					)
		)
	)
	WHEN -1 THEN '↓'
	WHEN 0 THEN '→'
	WHEN 1 THEN '↑'
	END
FROM Stocks

--drop Table Stocks

内部結語INNERJOIN


--分解して、同じテーブル同士で比較する
SELECT *
	FROM Stocks S2 inner JOIn Stocks S
	ON	S2.brand = S.brand
		AND S2.sale_date< S.sale_date

MAX

--Sの最大日がでるが1件のみ
SELECT MAX(S.sale_date)
	FROM Stocks S2 inner JOIn Stocks S
	ON	S2.brand = S.brand
		AND S2.sale_date< S.sale_date

	--Sの最大日がでるので、会社でまとめると会社分が出力される。ただし、同日はでない
	--同日が存在する場合はS2.sale_date<= S.sale_dateにする

それぞれ
ただし同日は指定していないので、同日は<=としる

SELECT MAX(S.sale_date)
	FROM Stocks S2 inner JOIn Stocks S
	ON	S2.brand = S.brand
		AND S2.sale_date < S.sale_date
	Group by S.brand--同日が存在する場合はS2.sale_date <= S.sale_dateにする



--S1とS2 でそれぞれ最大日がでる
SELECT MAX(S1.sale_date) ,MAX(S2.sale_date) FROM Stocks as S1
 CROSS JOIN Stocks as S2
WHERE
	S1.brand = S2.brand
	AND S1.sale_date < S2.sale_date--INNER JOINと同じ

--DROP TABLE Stocks

比較

--Stocks
--3つのStocksを使っている。
--外側のSTocksと2つ目のStocksで日付を比べて
--外側のStocksと1つ目のStocksで同じ日付で出力する
SELECT brand,sale_date,
	(SELECT S1.sale_date FROM Stocks S1
	WHERE S1.brand = Stocks.brand
		AND 
		sale_date = --Stocks.sale_date
		(SELECT MAX(S2.sale_date) FROM Stocks S2
		WHERE S2.brand = Stocks.brand 
		AND S2.sale_date< Stocks.sale_date
		)
	) as s1_date
FROM Stocks