0

参加したいテーブルが 2 つあります。

テーブル A には「週」という名前の 1 つの列があり、1、2、3、4、5、6 などの 52 行が含まれています。テーブル 2 には、「名前」、「週」、「合計」という名前の 3 つの列があります。 10行が含まれています:

'Bob', 1, 1
'Bob', 3, 1
'Joe', 4, 1
'Bob', 6, 1

これらを結合して、データが次のようになるようにします。

NAME|WEEK|TOTAL
'Bob', 1, 1
'Bob', 2, 0
'Bob', 3, 1
'Bob', 4, 0
'Bob', 5, 0
'Bob', 6, 1

ご覧のとおり、単純な外部結合です。ただし、これを実行しようとすると、どのような結合を使用しても、期待した結果が得られません。

以下の私のクエリ:

SELECT a.WEEK, b.Total
FROM Weeks a LEFT JOIN Totals b ON (a.Week = b.Week and b.Name ='Bob')

このクエリの結果は

NAME|WEEK|TOTAL
'Bob', 1, 1
'Bob', 3, 1
'Bob', 6, 1

助けてくれてありがとう!

4

3 に答える 3

3

アクセスは知っていますが、あなたの参加は正しくありません。ここで、SQL Server に進みます。同じ概念で、結合条件を見てください。

--dont worry about this code im just creating some temp tables

--table to store one column (mainly week number 1,2..52)
CREATE TABLE #Weeks
(
  weeknumber int
)

--insert some test data
--week numbers...I'll insert some for you
INSERT INTO #Weeks(weeknumber) VALUES(1)
INSERT INTO #Weeks(weeknumber) VALUES(2)
INSERT INTO #Weeks(weeknumber) VALUES(3)
INSERT INTO #Weeks(weeknumber) VALUES(4)
INSERT INTO #Weeks(weeknumber) VALUES(5)
INSERT INTO #Weeks(weeknumber) VALUES(6)

--create another table with two columns storing the week # and a total for that week
CREATE TABLE #Table2
 ( 
  weeknumber int,
  total int
 )

--insert some data
INSERT INTO #Table2(weeknumber, total) VALUES(1, 100)
--notice i skipped week 2 on purpose to show you the results
INSERT INTO #Table2(weeknumber, total) VALUES(3, 100)

--here's the magic
SELECT t1.weeknumber as weeknumber, ISNULL(t2.total,0) as total FROM 
#Weeks t1 LEFT JOIN #Table2 t2 ON t1.weeknumber=t2.weeknumber

--get rid of the temp tables
DROP TABLE #table2
DROP TABLE #Weeks

結果:

1   100
2   0
3   100
4   0
5   0
6   0

週番号テーブル (列が 1 つあるテーブル:

SELECT t1.weeknumber as weeknumber

null チェックを追加して、null 値を 0 に置き換えます。アクセスには次のようなものがあると思いますISNULL

ISNULL(t2.total, 0) as total

最初のテーブルから結合を開始し、週番号フィールドで 2 番目のテーブルに左結合します。結果は簡単です:

SELECT t1.weeknumber as weeknumber, ISNULL(t2.total,0) as total FROM 
#Weeks t1 LEFT JOIN #Table2 t2 ON t1.weeknumber=t2.weeknumber

私が投稿した他のすべてのコードに注意を払わないでください。一時テーブルを作成し、テーブルに値を挿入するためだけのものです。

于 2012-04-13T19:04:47.547 に答える
1
SELECT b.Name, b.Week, b.Total
  FROM Totals AS b 
 WHERE b.Name ='Bob'
UNION
SELECT 'Bob' AS Name, a.Week, 0 AS Total
  FROM Weeks AS a 
 WHERE NOT EXISTS ( SELECT * 
                      FROM Totals AS b 
                     WHERE a.Week = b.Week
                           AND b.Name ='Bob' );
于 2012-04-16T10:01:22.423 に答える
1

あなたは正しい軌道に乗っていましたが、左結合を使用する必要がありました. また、合計が null の場合、NZ 関数は 0 を設定します。

SELECT Totals.Person, Weeks.WeekNo, Nz(Totals.total, 0) as TotalAmount
FROM Weeks LEFT JOIN Totals 
ON (Weeks.WeekNo = Totals.weekno and Totals.Person = 'Bob');

編集:名前フィールドを省略したため、現在のクエリでは、表示した結果さえ得られません(予約語であるため、フィールドの名前は不適切です)。あなたはまだすべての情報を提供していません。このクエリは機能します。

*別のアプローチ: * Where 句を持つ Totals テーブルで別のクエリを作成します: Name = 'Bob'

Select Name, WeekNo, Total From Totals Where Name = 'Bob';

このクエリの Totals テーブルをそのクエリに置き換えます。

Select b.Name, w.WeekNo, b.total
from Weeks as w 
LEFT JOIN qryJustBob as b
on .WeekNo = b.WeekNo;
于 2012-04-13T19:20:15.070 に答える