2011-11-08 9 views
0

私はグループ化が必要なスクリプトを書いていますが、私はSQLでそれらを実行できません。私は結果をArrayReferenceとして取得します。 DBへの私のクエリは、このような何かを返します。グループperlのDBから2つの列

These are the list of BOX: 4575,45674,34367. 

These are the list of TIN: 1234,32364,87484,45476. 

任意の提案をしてください:私はそれらをしたい

1234 TIN 
32364 TIN 
34367 BOX 
87484 TIN 
45674 BOX 
45476 TIN 
4575 BOX 

は次のようにグループ化するには?

+1

クエリで 'group by'を使用してください....そうでなければ、返されたすべての行を実行し、BOXとTINを検索し、それに応じて個別の配列に格納します。 – Rahul

+0

Group byは、クエリで集合関数を使用する場合にのみ使用できます。そして、私は列内の任意の集計関数を行うことはできません。私はそのうちの2つだけを例として挙げました。私は10種類以上の検索をしています。あまりにも多くのif条件でコードが混乱しています.SQLでGroup byに間違っていると私を訂正してください。ありがとう –

+0

@SipraMoon - ナンセンス、もちろんあなたのデータベースでいくつかの集計を行うことができます。これは、RDBMSのために構築されたものの1つです! –

答えて

0

このためにデータベースを使用しないと主張する場合、次のコードでは基本的なグループ化が行われます。

# Assume data is in @rows 
my %group; 
push @{ $group{$_->[1]} }, $_->[0] for @rows; 

while (my ($key, $items) = each %group) { 
    print "These are the list of $key: ". join(',', @$items) .".\n"; 
} 
0

あなたの配列の参照はどのように見えますか?

@myArray = [ 
       [ 
        1234, 
        TIN, 
       ] 
       [ 
        32364, 
        TIN, 
       ] 
        34367, 
        BOX, 
       ] 
      ] 

またはハッシュの配列:それは、このような配列の配列

あり

 = [ 
       { 
        NUMBER => 1234, 
        TYPE => TIN, 
       } 
      ] 

各列は、fetchの何らかの形の単一戻りますか? DBIインタフェースを使用してデータベースからデータを返すために5種類の方法があります:あなたはfetchall_arrayrefを使用と仮定

  • fetchrow_hashref
  • fetchall_arrayref
  • fetchall_hashref
    • fetchrow_arrayref
    • fetchrow_arrayは、ここでは、あなたが望むことをするサンプルプログラムです:

      use strict; 
      use warnings; 
      use feature qw(say switch); 
      use Data::Dumper; 
      
      my $fetchedSqlData = [ 
              [ qw(1234 tin) ], 
              [ qw(3434 box) ], 
              [ qw(4341 tin) ], 
              [ qw(2343 box) ], 
             ]; 
      
      
      my @tinList; 
      my @boxList; 
      
      foreach my $row (@{$fetchedSqlData}) { 
          if ($row->[1] eq "tin") { 
           push @tinList => $row->[0]; 
          } 
          else { 
           push @boxList => $row->[0]; 
          } 
      
      } 
      
      say "These are the list of BOX: " . join ", " => @boxList; 
      say "These are the list of TIN: " . join ", " => @tinList; 
      

      良い方法は、2列の値に基づいて単一のハッシュを持っているだろうし、各ハッシュは、配列へのリファレンスであろう:これは少し混乱して

      my %typeHash; 
      foreach my $row (@{$fetchedSqlData}) { 
          $typeHash{$row->[1]} = [] if not exist $typeHash{$row->[1]}; 
          push @{$typeHash{$row->[1]}} => $row->[0]; 
      } 
      

      、しかしあなたのリストに "CRATE"というタイプを追加したほうがより柔軟になります。このデータをプリントアウト

      は次のようになります。

      foreach my $type (sort keys %typeHash) { 
          say "These are the list of $type: " . join ", " => $typeHash{$type}->[0]; 
      } 
      

      ところで、私は配列のこのハッシュをテストするので、コーディングエラーを期待していませんでした。そして、はい、私は$typeHash{$row->[1]) = [] if not exists $typeHash{$row->[1]}を行う必要はないことを知っていますが、私はハッシュ要素に正しいタイプのデータを格納していることを確認するので、これを行うのが好きです。

      これを徹底的にテストするには、データベースを構築し、DBI fetchall_arrayrefを実行して、データの返信方法を正確に検証する必要があります。 DBIが最後にそれを使用したときにどのように働いていたのか、そしてドキュメンテーションを私の不安定な記憶から逸脱しています。

      mapでこれを行う方法があるかもしれませんが、私は一般的に単純なループよりも効率的であるとは確信していません。map

    関連する問題