インナーセレクトイン
CASE WHEN VAL0 IN (SELECT * FROM tblDraw) THEN 1 ELSE 0 END
正確に 1 列を返す必要があります。現在、 のすべての列を返していますdbo.tblDraw
。
サブクエリで aを使用できるのSELECT * FROM
は、サブクエリがクエリの場合のみEXISTS(SELECT * FROM...)
です。
アップデート:
問題は、テーブルの設計が原因です。抽選イベント用のテーブルと、選択された番号ごとに 1 つの行を含む別のテーブルがあり、顧客側に同様のレイアウトがある場合、第 3 正規形に従っており、クエリは非常に単純になります。ただし、テーブル スキーマを変更できないと仮定しましょう。また、私のソリューションは 2005 以前では機能しないため、SQL 2008 以降を使用していると想定しています。
探している結果を得るには、基本的に、描画値と顧客選択値のピボットを解除する必要があります。結果セットに結合して、返される行数を数えることができます。すべての値が一意であると仮定すると (通常、宝くじの場合)、顧客が宝くじの抽選に対して行った正しい選択の数が得られます。
以下に解決策の例を投稿しました。すべてのコードに驚かないでください。そのほとんどは、テーブルを作成し、いくつかのランダムな値をテーブルに入れることです。クエリ 1の見出しの後のクエリだけが探しているものです。
オブジェクトを作成したときに名前を自由に変更しました。また、数字を少し変更して、一致が発生する可能性を高めました。私の例の宝くじは、15 のうち 6 の宝くじです。ただし、これはサンプル データの作成にのみ関連し、最終的なクエリには関連しません。
クエリは、最初に dbo.LottoDraws テーブルを dbo.CustomerSelections テーブルに対して結合します。次に、id はサブクエリにクロス適用します。そのサブクエリは、VALUE
演算子を使用して、最初に顧客の選択の値をアンピボットし、次に LotteryDraws の値をアンピボットします。次に、これら 2 つの結果セットを結合し、一致をカウントします。
SQL フィドル
MS SQL Server 2008 スキーマのセットアップ:
CREATE TABLE dbo.LottoDraws(
draw_date DATE PRIMARY KEY CLUSTERED,
draw1 INT,
draw2 INT,
draw3 INT,
draw4 INT,
draw5 INT,
draw6 INT
);
GO
CREATE TABLE dbo.CustomerSelections(
customer_id INT,-- REFERENCES Customer(customer_id)
draw_date DATE,
val1 INT,
val2 INT,
val3 INT,
val4 INT,
val5 INT,
val6 INT,
CONSTRAINT PK_CustomerPicks PRIMARY KEY (customer_id,draw_date)
);
GO
DELETE FROM dbo.LottoDraws;
DELETE FROM dbo.CustomerSelections;
INSERT INTO dbo.LottoDraws(draw_date,draw1,draw2,draw3,draw4,draw5,draw6)
SELECT CAST(dates.d AS DATE) AS draw_date,X4.*
FROM
(VALUES('2013-01-01'),('2013-02-02'),('2013-03-03'),('2013-04-04'),('2013-05-05'))dates(d)
CROSS APPLY
(
SELECT * FROM
(
SELECT 'val'+LTRIM(STR(ROW_NUMBER()OVER(ORDER BY (SELECT val)))) pick, val
FROM(
SELECT TOP(6) val
FROM(SELECT TOP(15) ROW_NUMBER()OVER(ORDER BY (SELECT NULL))*SIGN(LEN(dates.d)) val
FROM sys.columns a,sys.columns b,sys.columns c,sys.columns d)X1
ORDER BY NEWID()
)X2
)X3
PIVOT(MAX(val) FOR pick IN([val1],[val2],[val3],[val4],[val5],[val6]))P
)X4
;
INSERT INTO dbo.CustomerSelections(customer_id,draw_date,val1,val2,val3,val4,val5,val6)
SELECT customers.customer_id,CAST(dates.d AS DATE) AS draw_date,X4.*
FROM
(VALUES(111),(222),(333),(444))customers(customer_id)
CROSS JOIN
(VALUES('2013-01-01'),('2013-02-02'),('2013-03-03'),('2013-04-04'),('2013-05-05'))dates(d)
CROSS APPLY
(
SELECT * FROM
(
SELECT 'val'+LTRIM(STR(ROW_NUMBER()OVER(ORDER BY (SELECT val)))) pick, val
FROM(
SELECT TOP(6) val
FROM(SELECT TOP(15) ROW_NUMBER()OVER(ORDER BY (SELECT NULL))*SIGN(customers.customer_id+LEN(dates.d)) val
FROM sys.columns a,sys.columns b,sys.columns c,sys.columns d)X1
ORDER BY NEWID()
)X2
)X3
PIVOT(MAX(val) FOR pick IN([val1],[val2],[val3],[val4],[val5],[val6]))P
)X4
;
クエリ 1 :
SELECT *
FROM dbo.LottoDraws ld
JOIN dbo.CustomerSelections cs
ON ld.draw_date = cs.draw_date
CROSS APPLY(
SELECT COUNT(1) correct_count
FROM (VALUES(cs.val1),(cs.val2),(cs.val3),(cs.val4),(cs.val5),(cs.val6))csv(val)
JOIN (VALUES(ld.draw1),(ld.draw2),(ld.draw3),(ld.draw4),(ld.draw5),(ld.draw6))ldd(draw)
ON csv.val = ldd.draw
)CC
結果:
| DRAW_DATE | DRAW1 | DRAW2 | DRAW3 | DRAW4 | DRAW5 | DRAW6 | CUSTOMER_ID | VAL1 | VAL2 | VAL3 | VAL4 | VAL5 | VAL6 | CORRECT_COUNT |
--------------------------------------------------------------------------------------------------------------------------------------
| 2013-01-01 | 2 | 3 | 4 | 5 | 8 | 12 | 111 | 3 | 6 | 9 | 11 | 14 | 15 | 1 |
| 2013-02-02 | 2 | 3 | 5 | 6 | 12 | 14 | 111 | 1 | 2 | 3 | 10 | 11 | 14 | 3 |
| 2013-03-03 | 5 | 6 | 8 | 10 | 11 | 14 | 111 | 2 | 3 | 6 | 13 | 14 | 15 | 2 |
| 2013-04-04 | 2 | 3 | 5 | 6 | 10 | 12 | 111 | 3 | 5 | 6 | 7 | 12 | 15 | 4 |
| 2013-05-05 | 3 | 6 | 7 | 10 | 11 | 12 | 111 | 1 | 4 | 6 | 7 | 9 | 11 | 3 |
| 2013-01-01 | 2 | 3 | 4 | 5 | 8 | 12 | 222 | 3 | 6 | 8 | 9 | 11 | 14 | 2 |
| 2013-02-02 | 2 | 3 | 5 | 6 | 12 | 14 | 222 | 5 | 7 | 11 | 12 | 13 | 14 | 3 |
| 2013-03-03 | 5 | 6 | 8 | 10 | 11 | 14 | 222 | 2 | 6 | 8 | 10 | 13 | 14 | 4 |
| 2013-04-04 | 2 | 3 | 5 | 6 | 10 | 12 | 222 | 4 | 7 | 8 | 11 | 12 | 15 | 1 |
| 2013-05-05 | 3 | 6 | 7 | 10 | 11 | 12 | 222 | 1 | 2 | 4 | 5 | 11 | 14 | 1 |
| 2013-01-01 | 2 | 3 | 4 | 5 | 8 | 12 | 333 | 3 | 7 | 8 | 10 | 14 | 15 | 2 |
| 2013-02-02 | 2 | 3 | 5 | 6 | 12 | 14 | 333 | 2 | 3 | 4 | 7 | 8 | 10 | 2 |
| 2013-03-03 | 5 | 6 | 8 | 10 | 11 | 14 | 333 | 5 | 6 | 7 | 11 | 12 | 14 | 4 |
| 2013-04-04 | 2 | 3 | 5 | 6 | 10 | 12 | 333 | 1 | 8 | 11 | 12 | 14 | 15 | 1 |
| 2013-05-05 | 3 | 6 | 7 | 10 | 11 | 12 | 333 | 3 | 4 | 5 | 8 | 10 | 13 | 2 |
| 2013-01-01 | 2 | 3 | 4 | 5 | 8 | 12 | 444 | 2 | 8 | 10 | 11 | 13 | 14 | 2 |
| 2013-02-02 | 2 | 3 | 5 | 6 | 12 | 14 | 444 | 4 | 6 | 7 | 9 | 10 | 13 | 1 |
| 2013-03-03 | 5 | 6 | 8 | 10 | 11 | 14 | 444 | 2 | 3 | 4 | 6 | 11 | 15 | 2 |
| 2013-04-04 | 2 | 3 | 5 | 6 | 10 | 12 | 444 | 2 | 4 | 7 | 8 | 12 | 14 | 2 |
| 2013-05-05 | 3 | 6 | 7 | 10 | 11 | 12 | 444 | 4 | 7 | 11 | 13 | 14 | 15 | 2 |