• ベストアンサー

データを抽出したいのです

以下のようなデータがあり抽出したいのです(エクセルもしくはアクセス)。実際は何千件もあります。 2007年生まれで、その子どもの続柄が「3」ならば世帯主(1)または妻(2)以外の1987生まれ以前の人がいる世帯。 またはその子どもの続柄が「子の子」ならばその世帯。 この例の場合、世帯番号で2、5、8が該当世帯です。 よろしくお願いします。 1:世帯主 2:妻 3:子 4:子の子 5:その他 世帯番号  生年  続柄 1 1967 1 1 1972 2 1 2001 3 1 2007 3 2 1948 1 2 1950 2 2 1972 3 2 1974 3 2 2005 4 2 2007 4 3 1968 1 3 1973 2 3 2007 3 4 1974 1 4 2007 3 5 1968 1 5 1973 2 5 2007 3 5 1940 5 6 1975 1 6 2003 3 6 2007 3 7 1970 1 7 1974 2 7 2007 3 7 1995 5 8 1949 1 8 1969 3 8 1974 3 8 2007 4 9 1974 1 9 1975 2 9 2006 3 10 1949 1 10 1950 2 10 1970 3 10 1975 3 10 2005 4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

accessの場合、元データが、T_データだったとします。 以下のクエリ1からクエリ4までをクエリのSQLビューで打ち込んでください。 クエリ4以外はデザインビューで読めるようになるはずです。 2007年生まれで、その子どもの続柄が「3」の世帯 クエリ1=SELECT 世帯番号 FROM T_データ WHERE (生年=2007) AND (続柄=3) その世帯で、世帯主(1)または妻(2)以外の1987生まれ以前の人がいる世帯。 クエリ2=SELECT T_データ.世帯番号 FROM クエリ1 LEFT JOIN T_データ ON クエリ1.世帯番号 = T_データ.世帯番号 WHERE (生年<1987) AND (続柄<>1) And (続柄<>2) 2007年生まれで、その子どもの続柄が「子の子」ならばその世帯 クエリ3=SELECT 世帯番号 FROM T_データ WHERE 生年=2007 AND 続柄=4 クエリ2とクエリ3の世帯 クエリ4=select 世帯番号 from クエリ2 UNION select 世帯番号 from クエリ3 クエリ4が結果になると思います。 クエリ4のUNIONの所は、一応これで良いと思うのですが、間違ってたら誰か指摘してください。

jyouhoukan
質問者

お礼

遅くなって申し訳ありません。助かりました。ありがとうございました。

その他の回答 (5)

回答No.6

excelのVBAです。 元データはsheet1にあるとします。 抽出結果はsheet2のA列の2行目からに表示します。 checkを実行してください。 Sub check() Sheet2.Cells.Clear Dim lastRow As Integer Dim sRow As Integer Dim eRow As Integer Dim i As Integer lastRow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row sRow = 2 For i = 2 To lastRow If Sheet1.Cells(i, 1) <> Sheet1.Cells(sRow, 1) Then eRow = i - 1 checkFamily sRow, eRow sRow = i End If Next checkFamily sRow, lastRow End Sub '1世帯チェック Sub checkFamily(sRow As Integer, eRow As Integer) Dim 子2007年生まれ As Boolean Dim 子の子2007年生まれ As Boolean Dim 世帯主または妻以外の1987生まれ以前の人 As Boolean Dim i As Integer For i = sRow To eRow If (Sheet1.Cells(i, 2) = 2007) And (Sheet1.Cells(i, 3) = 3) Then 子2007年生まれ = True End If If (Sheet1.Cells(i, 2) = 2007) And (Sheet1.Cells(i, 3) = 4) Then 子の子2007年生まれ = True End If If (Sheet1.Cells(i, 3) <> 1) And (Sheet1.Cells(i, 3) <> 2) And (Sheet1.Cells(i, 2) < 1987) Then 世帯主または妻以外の1987生まれ以前の人 = True End If Next If ((子2007年生まれ = True) And (世帯主または妻以外の1987生まれ以前の人 = True)) Or (子の子2007年生まれ = True) Then Sheet2.Cells(Sheet2.Cells(Sheet2.Rows.Count, 1).End(xlUp).Row + 1, 1) = Sheet1.Cells(sRow, 1) End If End Sub

jyouhoukan
質問者

お礼

遅くなって申し訳ありません。回答ありがとうございました。

noname#204879
noname#204879
回答No.5

   A    B  C   D   E   F   G    H 1  世帯 生年 続柄 TMP1 TMP2 TMP3 TMP4 該当世帯 2   1 1967   1   0   0   0        2 3   1 1972   2   0   0   0        5 4   1 2001   3   0   0   0        8 5   1 2007   3   0   1   0 6   2 1948   1   0   0   0 …  …  …  …  …  …  … 10   2 2005   4   0   0   0 11   2 2007   4   2   0   0   2 12   3 1968   1   0   0   0 …  …  …  …  …  …  … 19   5 2007   3   0   5   0 20   5 1940   5   0   0   5   5 30   8 1974   3   0   0   0 31   8 2007   4   8   0   0   8 32   9 1974   1   0   0   0 38  10 1975   3   0   0   0 39  10 2005   4   0   0   0 40 D2: =$A$2:$A$1000*($B$2:$B$1000=2007)*($C$2:$C$1000=4) E2: =$A$2:$A$1000*($B$2:$B$1000=2007)*($C$2:$C$1000=3) F2: =A2*NOT(ISERROR(MATCH(A2,E$2:E$1000,FALSE)))*AND(B$2:B$1000<1986,C$2:C$1000>2) G2: =IF(D2+F2,D2+F2,"") 範囲 D2:G2 を下方にズズーッとドラッグ&コピー H2: =SMALL(G$2:G$1000,ROW(A1))   [条件付き書式]で次の設定     数式が    =ISERROR(H2)     フォント色  白 セル H2 を下方にズズーッとドラッグ&コピー

jyouhoukan
質問者

お礼

遅くなって申し訳ありません。回答ありがとうございました。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.4

クエリ1個でもできます。 ただ、メンテナンスが難しくなりますので SQLが得意というのでなければ、複数クエリでやる方がお勧めです。 --------------------------- SELECT 世帯番号 FROM データ WHERE (世帯番号 In (SELECT 世帯番号 FROM データ WHERE ((生年<1987) AND (続柄 In (3,4,5)));) ) AND (生年=2007) AND (続柄=3) UNION SELECT 世帯番号 FROM データ WHERE (続柄=4) AND (生年=2007);

jyouhoukan
質問者

お礼

遅くなって申し訳ありません。回答ありがとうございました。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

>この例の場合、世帯番号で2、5、8が該当世帯です。 どうして10が省かれるの?

jyouhoukan
質問者

補足

遅くなりまして申し訳ありません。 単純に2007年生まれがいないからです。

  • falst
  • ベストアンサー率33% (16/48)
回答No.2

アクセスでやるのであれば、 基礎データをテーブル(X)として 1、生年2007と続柄3で抽出、世帯番号クエリを作成、(A) 2、生年2007と続柄4で抽出、世帯番号クエリを作成(B) 3、続柄1と2で抽出、世帯番号クエリを作成(C) 4、(B)と(X)で世帯番号で関連付けをし、両方含むものの世帯番号のクエリを作成し、生年が1987以前で抽出(回答1) 5、(A)と(C)で世帯番号で関連付けをし、両方含むものの世帯番号クエリを作成し、生年が1987以前で抽出(回答2) 回答1で子の子で世帯員に1987以前のものを含む世帯番号を抽出できる。 回答2で子で続柄が1か2のものが1987以前のものを含む世帯番号を抽出できる。 回答1と2を合体させて完了です。

jyouhoukan
質問者

お礼

遅くなって申し訳ありません。回答ありがとうございました。