0

以下の表を確認してください。

表1

Key    Title     Type
----------------------
A1     Test1       A 
A2     Test2       A 
B1     Test1       B
B2     Test2       B
B3     Test3       B
C1     Test1       C
C2     Test2       C

表2

Id   Name    Address      A        B            C 
---------------------------------------------------
 1   Soham   Add1         A1       B1,B3        C2
 2   Varun   Add2         A1,A2    B1,B2,B4     C1

私のrdlcレポートはId=1のようになります

Name : Soham
Address : Add1
Type : A
         A1  - Yes
         A2  - No

Type : B 
         B1 -  Yes
         B2 -  No
         B3 -  Yes
         B4 -  No

Type : C
         C1 -  No
         C2 -  Yes

レポートの場合、Id=2のようになります。

Name : Varun
Address : Add2
Type : A
         A1  - Yes
         A2  - Yes

Type : B 
         B1 -  Yes
         B2 -  Yes
         B3 -  No
         B4 -  Yes

Type : C
         C1 -  Yes
         C2 -  No

サブレポートを使用していない場合、単一のクエリでどのように達成できますか。または、サブレポートを使用してこれをどのように達成できますか

4

1 に答える 1

0

MySQL を使用している場合は、「FIND_IN_SET()」関数を使用して、このように適用できます...単純なデータ グループ化により、RDLC の正しい順序で 1 つの結果セットが返されます...

select
      PreQuery.*
   from
      ( select
              t2.id,
              t2.`name`,
              t2.Address,
              t1.`type`,
              t1.`key`,
              case when FIND_IN_SET(t1.`key`, t2.A )  > 0 then 'yes' else 'no ' end HasKey
           from
              table1 t1,
              table2 t2
           where
              t1.`type` = 'A'
        UNION    
        select
              t2.id,
              t2.`name`,
              t2.Address,
              t1.`type`,
              t1.`key`,
              case when FIND_IN_SET(t1.`key`, t2.B )  > 0 then 'yes' else 'no ' end HasKey
           from
              table1 t1,
              table2 t2
           where
              t1.`type` = 'B'
        UNION    
        select
              t2.id,
              t2.`name`,
              t2.Address,
              t1.`type`,
              t1.`key`,
              case when FIND_IN_SET(t1.`key`, t2.C )  > 0 then 'yes' else 'no ' end HasKey
           from
              table1 t1,
              table2 t2
           where
              t1.`type` = 'C' ) PreQuery
   order by
      PreQuery.`name`,
      PreQuery.`type`,
      PreQuery.`key`

SQL-Server を使用している場合は、関数呼び出しを FIND_IN_SET() から CHARINDEX() に変更します。

さて、上記のクエリで必要なものが得られたとしても、データベース設計が本当に悪いのです。実際には、ユーザーのキーとユーザーが持っているものを含む別のテーブルが必要です...など...

UserHasTable
userHasID   int auto-increment
userid      int           <-- to link to the person
hasKey      varchar(??)   <-- to correspond with the 'key' they have.

次に、レコードは各人ごとに次のようになります

UserHasID   UserID  HasKey
1           1       A1
2           1       B1
3           1       B3
4           1       C2
5           2       A1
6           2       A2
7           2       B1
8           2       B2
9           2       B4
10          2       C1

次に、各 A、B、C 列を明示的に分割することなく、クエリを単純化できます。

于 2012-11-23T15:38:56.383 に答える