Присоединяйтесь, чтобы быть созданным на лету - PullRequest
0 голосов
/ 23 января 2020

введите описание изображения здесь Работа с Jaspersoft и SQL: у меня есть таблица с названием Claims, которая имеет несколько полей, таких как ClaimNo, ShippingNo, ShippingAddress, TrackingNo и 5 других полей. Теперь пользователь может загрузить в эту же таблицу подмножество данных, просто скажите ClaimNo и ShippingNo. Мы можем отслеживать, когда загрузка была выполнена по дате, а также по пользователю, который создал загрузку.

Теперь мне нужно создать отчет SQL, в котором пользователь на внешнем интерфейсе может выбрать дату загрузки, пользователя, который загрузил данные, и 9 фильтров с выбором «да» или «нет», а объединения в резервной копии должны: создан на основе фильтров, которые они выбирают. Это делается для того, чтобы выяснить, есть ли в созданной ими загрузке уже совпадающие данные в существующей таблице.

Это запрос, с которым я столкнулся, при условии наличия одного совпадающего поля, поэтому у меня есть условие для присоединения их Но я ошибся в своем предположении. Условия объединения должны быть созданы на основе выбора пользователя

select   
main.ClaimNo, 
main.ShippingNo, 
main.ShippingAddress, 
main.TrackingNo
from ClaimsTable Main 
inner join 
(
select   
ClaimNo, 
ShippingNo, 
ShippingAddress, 
TrackingNo
from ClaimsTable 
where uploaddate between date1 and date2
and uploadedby ='user1' 
) Temp
on (join condition based on filters selected)

. Сначала я предполагал, что могу присоединиться с помощью поля идентификатора, но, очевидно, это невозможно, поскольку у них нет совпадающих идентификаторов. Я создал два параметра в Jasper, один из них - внешний интерфейс ShippingNo, с выпадающим списком да или нет,

($P{ShippingNo}.equals("Yes") ? "AND main.ShippingNo= temp.ShippingNo"   : " ") 

, если они выбрали да, тогда он будет добавлен в запрос выше. Но без установленного условия соединения, как мне добавить эти операторы, так как к ним всегда присоединено AND.

Итак, давайте скажем, что данные выглядели так, как в таблице утверждений, перед загрузкой:


 **ID** **ClaimNo** **ShippingNo** **ShippingAddress** **TrackingNo** **UDate** 
==================================================================================  
   1        101        s1             1501 Peters             T1        1/23/2020
   2        102        s2             5 Lombard Ave           T2        1/23/2020
   3        103        s3             23 Granville St         T3        1/23/2020
   4        104        s4             101 Park                T4        1/24/2020

And then the next day user uploads data into the same table 
 **ID** **ClaimNo** **ShippingNo** **ShippingAddress** **TrackingNo** **UDate** 
==================================================================================  
   1        101        s1             1501 Peters             T1        1/23/2020
   2        102        s2             5 Lombard Ave           T2        1/23/2020
   3        103        s3             23 Granville St         T3        1/23/2020
   4        104        s4             101 Park                T4        1/24/2020
   5                   s3                                     T3        1/25/2020
   6                   s2                                     T2        1/25/2020

Теперь, если пользователь запускает отчет на внешнем интерфейсе: есть возможность выбора если они хотят соответствовать любому из приведенных ниже фильтров наряду с датой и пользователем. Таким образом, в нашем случае пользователь теперь хочет увидеть, совпадают ли две загрузки, которые он сделал недавно, с какими-либо уже существующими значениями (мы видим, что Отгрузка № и Отслеживание Нет совпадают)

Claim No -> Yes or No
Shipping No -> Yes or No
Shipping Address-> Yes or no
TrackingNo -> Yes or No

Они выбирают Да при отгрузке Нет и номер отслеживания

, поэтому теперь необходимо построить sql, как показано ниже

select   
main.ClaimNo, 
main.ShippingNo, 
main.ShippingAddress, 
main.TrackingNo
from ClaimsTable Main 
inner join 
(
select   
ClaimNo, 
ShippingNo, 
ShippingAddress, 
TrackingNo
from ClaimsTable 
where uploaddate between date1 and date2
and uploadedby ='user1' 
) Temp
on (main.ShippingNo = temp.Shipping no
and main.TrackingNo= temp.TrackingNo)
    **ID** **ClaimNo** **ShippingNo** **ShippingAddress** **TrackingNo** **UDate** 
==================================================================================  
     2        102        s2             5 Lombard Ave          T2        1/23/2020
     3        103        s3             23 Granville St         T3       1/23/2020

Как мне заставить это работать? Нужно ли писать 81 комбинацию выбора пользовательских фильтров или есть более простой способ? Любое понимание будет полезно.

1 Ответ

0 голосов
/ 24 января 2020

Измените ваше условие ВКЛ, чтобы включить тавтологию в качестве фиксированного предиката, а затем построите остаток с помощью И каждого из выбранных условий. Это позволяет избежать проверки каждого условия как первого в порядке, пропуская AND для этого условия. Так

 select main.ClaimNo           "main ClaimNo"
      , main.ShippingNo        "main ShippingNo"
      , main.ShippingAddress   "main ShippingAddress"
      , main.TrackingNo        "main TrackingNo"
      , upload.ClaimNo         "upload ClaimNo"
      , upload.ShippingNo      "upload ShippingNo"
      , upload.ShippingAddress "upload ShippingAddress"
      , upload.TrackingNo      "upload TrackingNo"
   from claimstable  main
   join claimsupload upload
     on ( TRUE
        ...

Где «...» заменяется на «И» для каждого условия, когда пользователь выбрал «ДА». Для условий пользователь выбирает «НЕТ», а затем не изменяет запрос здания. Затем добавьте следующее:

        ) 
 where uploaddate between date1 and date2
   and uploadedby ='user1';

Я скомбинировал в более стандартный, хотя способ, которым вы его используете, также должен работать, за исключением, возможно, позиции в предложении where. Также в своем текущем запросе вы фактически присоединяете CalimsTable к себе. Только потому, что вы изменились, никто не делает это другим. Для этого я использовал имя ClaimsUpload. Вам нужно будет исправить до фактической таблицы.

Предположим, пользователь выбрал Да для ClaimNo и TrackingNO и выбрал НЕТ для всех других условий. Результирующий запрос будет:

 select main.ClaimNo           "main ClaimNo"
      , main.ShippingNo        "main ShippingNo"
      , main.ShippingAddress   "main ShippingAddress"
      , main.TrackingNo        "main TrackingNo"
      , upload.ClaimNo         "upload ClaimNo"
      , upload.ShippingNo      "upload ShippingNo"
      , upload.ShippingAddress "upload ShippingAddress"
      , upload.TrackingNo      "upload TrackingNo"
   from claimstable  main
   join claimsupload upload
     on ( TRUE
          AND main.claimno = upload.claimno
          AND main.trackingno = upload.trackingno
        ) 
 where uploaddate between date1 and date2
   and uploadedby ='user1';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...