Как извлечь данные из таблицы с условиями? - PullRequest
0 голосов
/ 16 мая 2019

Я разрабатываю представление базы данных на сервере mysql, чтобы получить статус grns, присоединив grns к таблице комментариев. Я хочу показать, что отклонено или одобрено. В таблице комментариев может быть несколько комментариев для отдельных гринов.

Если в таблице комментариев есть единственное «Утверждение» для grn, состояние grn должно быть возвращено как «Утверждено», в противном случае «Отклонено» или «Ожидание» Вот фиктивная таблица двух таблиц.

grn and comment tables

ожидаемые результаты:

G1 - rejected
G2 - approved
G3 - approved
G4 - approved
G5 - approved

Ответы [ 4 ]

3 голосов
/ 16 мая 2019

Вы можете сделать это с помощью теста, существуют ли строки в comment со статусом approved или rejected для каждого значения grn-no.Если grn не утвержден и не отклонен, устанавливается состояние pending.

SELECT g.`grn-no`,
       CASE WHEN EXISTS (SELECT * FROM comment c WHERE c.grn_id = g.id AND c.status = 'approved') THEN 'approved'
            WHEN EXISTS (SELECT * FROM comment c WHERE c.grn_id = g.id AND c.status = 'rejected') THEN 'rejected'
            ELSE 'pending' END AS status
FROM grn g    

Выход:

grn-no  status
G1      rejected
G2      approved
G3      approved
G4      approved
G5      approved

Демонстрация на dbfiddle

2 голосов
/ 16 мая 2019

Вы можете использовать group_concat(flatten) функцию

Select
`grn-no`, 
Case when status like ('%approved%') then 'approved' else 'rejected' end as status 
From
(Select  
`grn-no`, 
 group_concat(status) as status 
 From grn 
 left join comment 
 on grn.id = comment.grn_id  
 group by 1) a
2 голосов
/ 16 мая 2019

Вы можете использовать correlated subquery

select concat(grn_no,
              ' - ',
              coalesce((select status
                         from comment
                        where status = 'approved'
                          and grn_id = g.id
                        group by grn_id),
                       'rejected')) "Result"
  from grn g

Демо

0 голосов
/ 29 июня 2019

Наконец я нашел все функции, следующие за кодом выше. Над вопросом было разработать представление базы данных ниже.

CREATE OR REPLACE VIEW summery AS

    SELECT
    g.id,
    g.supply_date,
    g.grn_no,
    COUNT(b.bag_no) AS bags,
    CONCAT(s.fname," ", s.lname) AS name,
    SUM(b.weight) AS qty,
    AVG(b.bag_mc) AS mc,
    (g.dust_initial/g.dust_weight)*100 AS dust,
    (g.ubs_initial/g.ubs_weight)*100 AS ubs,
    p.fraction_1 AS fraction_1,
       CASE
        WHEN EXISTS (SELECT * FROM comments c WHERE c.grn_id = g.id AND c.status = 'approved') THEN 'Approved'
        WHEN EXISTS (SELECT * FROM comments c WHERE c.grn_id = g.id AND c.status = 'approved with concession') THEN 'Approved with Concession'
        WHEN EXISTS (SELECT * FROM comments c WHERE c.grn_id = g.id AND c.status = 'concession required') THEN 'Concession Required'
        WHEN EXISTS (SELECT * FROM comments c WHERE c.grn_id = g.id AND c.status = 'rejected') THEN 'Rejected'
       ELSE 'pending' END AS status
FROM grns g
    JOIN suppliers s ON s.id = g.supplier_id
    JOIN psds p ON g.id = p.grn_id
    JOIN bags b ON g.id = b.grn_id
GROUP BY g.id
ORDER BY g.id DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...