1

私は次のSQLを持っています:

SELECT LOTTOID,
      CASE WHEN VAL0 IN (SELECT * FROM tblDraw) THEN 1 ELSE 0 END
    + CASE WHEN VAL1 IN (SELECT * FROM tblDraw) THEN 1 ELSE 0 END
    + CASE WHEN VAL2 IN (SELECT * FROM tblDraw) THEN 1 ELSE 0 END
    + CASE WHEN VAL3 IN (SELECT * FROM tblDraw) THEN 1 ELSE 0 END
    + CASE WHEN VAL4 IN (SELECT * FROM tblDraw) THEN 1 ELSE 0 END
    + CASE WHEN VAL5 IN (SELECT * FROM tblDraw) THEN 1 ELSE 0 END
    AS totalValues
INTO #tempWinners
FROM tblLotto 

しかし、line2 で次のエラーが発生します。

サブクエリが EXISTS で導入されていない場合、選択リストに指定できる式は 1 つだけです。

テーブルは次のtblDrawようになります。

LOTTOID VAL0    VAL1    VAL2    VAL3    VAL4    VAL5    DRAWDATE
    3    7       13      15      17      21      43     2013-06-23 10:56:08.927

基本的に私がやろうとしているのは、誰かがロト番号と一致するかどうかを解決するために SQL を使用することです。

tblDraw テーブルはドローです (明らかに)。私はこのようなチェックを行うことができることを知っています:

SELECT VAL0 FROM tblLotto WHERE IN (SELECT VAL0 FROM tblDraw)

しかし、tblLotto の val0 は、潜在的に「7」が列にある可能性があるため、抽選の val0 列と常に一致するとは限りval4ません。したがって、すべての列をチェックする必要があります...

4

2 に答える 2

2

インナーセレクトイン

  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 |
于 2013-06-29T20:25:36.807 に答える
0

VAL0、VAL1.... は、サブクエリで単一の列を探しています。の代わりにselect * from tblDraw、一意の列を返してみてください。

于 2013-06-29T21:00:17.603 に答える