ПРИСОЕДИНЯЙТЕСЬ К ГДЕ и добавьте вычисляемый столбец

0

Ищем помощь. Я пытаюсь запустить код в этом порядке JOIN, WHERE и номер GRP (по результатам моего запроса).

У меня есть две таблицы test и text:

create table test (
    code varchar(10) primary key,
    num int(10) not null,
    name varchar(10) not null,
    surname varchar(10) not null);

insert into test values (1,09,'Tom', 'Smith');
insert into test values (2,09,'Adam','Blake');
insert into test values (3,15,'John','Smith');
insert into test values (4,15,'Adam','XYZ');
insert into test values (5,43,'John','Abc');
insert into test values (6,99,'Adam','Abc');
insert into test values (7,99,'John','Abc');
insert into test values (8,15,'Adam','XYZ');
insert into test values (9,43,'John','Abc');
insert into test values (10,99,'Adam','Abc');
insert into test values (11,99,'John','Abc');
insert into test values (12,1,'A','A');
insert into test values (13,1,'J','A');

и текст таблицы:

create table text (
    code varchar(10) primary key,
    codeFK varchar(10) not null,
    state varchar(10));

insert into text values (1,2,'O');
insert into text values (2,2,'O');
insert into text values (3,2,'O');
insert into text values (4,2,'C');
insert into text values (5,3,'O');
insert into text values (6,3,'O');
insert into text values (7,3,'O');
insert into text values (8,2,'O');
insert into text values (9,2,'C');
insert into text values (10,2,'O');
insert into text values (11,2,'C');
insert into text values (12,1,'C');
insert into text values (13,12,'C');
insert into text values (14,13,'C');

Я присоединяюсь к ним и пытаюсь добавить группу coulm в соответствии с приведенным ниже кодом:

JOIN - он работает

SELECT num FROM test
LEFT JOIN text ON test.code = text.codeFK
WHERE state = 'O' 

ORDER BY test.num DESC;

Расчет ВРП на

select t.*,
       (select count(distinct t2.num)
        from test t2
        where t2.num <= t.num
       ) as grp
from test t ORDER BY GRP;

Но мой вопрос заключается в том, как получить столбец GRP с вышеуказанным запросом соединения? Таким образом, столбец grp будет вычисляться только по результатам, основанным на инструкции WHERE, а не по всему тесту таблицы.

Я попробовал ниже, но это дает мне ошибку:

SELECT num FROM test
LEFT JOIN text ON test.code = text.codeFK
WHERE state = 'O' 

AND test.num IN (select t.num,
       (select count(distinct t2.num)
        from test t2
        where t2.num <= t.num
       ) as grp from test t)

ORDER BY test.num DESC;

Желаемые результаты:

Изображение 174551

  • 0
    изображение желаемых результатов не приносит никакого вреда. Мы можем ясно видеть, что ОП пытается добиться от этого.
Теги:

2 ответа

1
Лучший ответ

Попробуй это:

select test.num, tt.cnt from test 
join text on test.code = text.codefk
join (
    select t1.num, count(*) cnt from (
        select distinct num
        from test ts1 
    join text tx1 on ts1.code = tx1.codefk
    where tx1.state = 'O'
) t1 join (
    select distinct num
    from test ts2
        join text tx2 on ts2.code = tx2.codefk
        where tx2.state = 'O'
    ) t2 on t1.num <= t2.num
    group by t1.num
) tt on test.num = tt.num
where text.state = 'O'

Другой способ, более эффективный:

select @lagNum := 0, @cnt := 0;
select num, cnt from (
    select case when num <> @lagNum then @cnt := @cnt + 1 end, @cnt cnt, @lagNum := num, num
    from (
        select (select num from test where code = t.codefk) num
        from text t
        where state = 'O'
    ) a order by num
) a    
  • 0
    ВАУ! Большое спасибо.
  • 0
    @Kalenji Попробуйте обновленный ответ :)
Показать ещё 1 комментарий
0

EDITED: Это должно указывать на правильное направление. Вместо этого второго запроса в AND это должно быть то, что вы выбираете

моя скрипка: http://sqlfiddle.com/#!9/2fe48b/36

select t.num,
   (select count(distinct t2.num) - 1
    from test t2
    where t2.num <= t.num
   ) as grp
from test t
LEFT JOIN text ON t.code = text.codeFK
WHERE text.state = 'O' 
ORDER BY t.num DESC;
  • 0
    Спасибо, однако, он возвращает неверные результаты. Могу поспорить, что он не может дать правильные результаты, потому что парсеры SQL читают предложение WHERE, прежде чем они читают выражения SELECT. Я пытаюсь иметь, но это тоже не работает. select t.num, t.name, (select count(distinct t2.num) from test t2 where t2.num <= t.num ) as grp from test t LEFT JOIN text ON t.code = text.codeFK GROUP BY t.num, t.name,grp,text.state HAVING text.state = 'O'
  • 0
    @Kalenji Я обновил его, я думаю, что я вижу, что вы собираетесь сейчас с этой колонкой GRP

Ещё вопросы

Сообщество Overcoder
Наверх
Меню