- ベストアンサー
データを抽出したいのです
以下のようなデータがあり抽出したいのです(エクセルもしくはアクセス)。実際は何千件もあります。 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
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
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の所は、一応これで良いと思うのですが、間違ってたら誰か指摘してください。
その他の回答 (5)
- fumufumu_2006
- ベストアンサー率66% (163/245)
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
お礼
遅くなって申し訳ありません。回答ありがとうございました。
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 を下方にズズーッとドラッグ&コピー
お礼
遅くなって申し訳ありません。回答ありがとうございました。
- bonaron
- ベストアンサー率64% (482/745)
クエリ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);
お礼
遅くなって申し訳ありません。回答ありがとうございました。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>この例の場合、世帯番号で2、5、8が該当世帯です。 どうして10が省かれるの?
補足
遅くなりまして申し訳ありません。 単純に2007年生まれがいないからです。
- falst
- ベストアンサー率33% (16/48)
アクセスでやるのであれば、 基礎データをテーブル(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を合体させて完了です。
お礼
遅くなって申し訳ありません。回答ありがとうございました。
お礼
遅くなって申し訳ありません。助かりました。ありがとうございました。