powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вывод записей
18 сообщений из 18, страница 1 из 1
Вывод записей
    #40080599
Raze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день! Подскажите пожалуйста, есть небольшой запрос и получается, что dlit (длительность) выводится несколько раз из-за связи mktsreg.n_kdk = t.C_KTHR, что можно сделать?..
Если вкратце описывать что тут в запросе происходит - dmz.kdmt = 'ДСЕ1' (тип документа); tthr (таблица с доп. характеристиками, которая связывается с таблицей документов по уникальному ключу undoc, FAM - название доп. характеристики); PRTR (таблица с длительностью перемещений со склада (ceh_o ) на другой склад (ceh_k)); mktsreg (таблица регистрации выработки, где рабочие регистрируют выработку. Соответственно на одного человека за один день может быть зарегистрировано от 2-х и больше выработок, регистрация выработки так же связывается с доп. характеристиками по уникальному полю n_kdk (табельный номер сотрудника)).

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select  DATEADD(minute, -30, mktsreg.date_d) as date, mktsreg.unmktsreg as unmktsreg
         ,isnull((select top 1 prtr.dlit
          from dmz
          inner join tthr t
	        on t.strkey=str(dmz.UNDOC,10) and t.kthr = 'FAM' 
          inner join PRTR 
	        on dmz.ceh_o = prtr.ceh_o and  dmz.ceh_k = prtr.ceh_k
          where dmz.kdmt = 'ДСЕ1' and mktsreg.n_kdk = t.C_KTHR
          group by prtr.dlit),0 ) as sum_dd
from mktsreg
where cast(DATEADD(minute, -30, mktsreg.date_d) as date) BETWEEN @dateFrom AND @dateTo



Как пример, получается так:
date: 01-06-21 unmktsreg: 1234 sum_dd: 300
date: 01-06-21 unmktsreg: 5246 sum_dd: 300
date: 01-06-21 unmktsreg: 4875 sum_dd: 300

А нужно так:
date: 01-06-21 unmktsreg: 1234 sum_dd: 300
date: 01-06-21 unmktsreg: 5246 sum_dd: 0
date: 01-06-21 unmktsreg: 4875 sum_dd: 0

Помогите пожалуйста разобраться..
...
Рейтинг: 0 / 0
Вывод записей
    #40080733
ol_chig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Raze,

если mktsreg.n_kdk это уникальный номер сотрудника, то поле C_KTHR из таблицы tthr должно соответствовать этому номеру. Это единственное чем можно связать таблицы? и верно ли они связаны вообще? Если связь установлена неправильно, то "top 1" будет всегда вытаскивать не тот "top 1", который нужен.
...
Рейтинг: 0 / 0
Вывод записей
    #40080742
Raze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ol_chig, да, единственное чем можно связать таблицы
ммм.... можно использовать left join, но по сути это ничего не даст, тоже уже пробовал менять связь..
...
Рейтинг: 0 / 0
Вывод записей
    #40080785
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select DATEADD(minute, -30, mktsreg.date_d) as date, mktsreg.unmktsreg as unmktsreg
,isnull((select top 1 prtr.dlit
from dmz
inner join tthr t
on t.strkey=str(dmz.UNDOC,10) and t.kthr = 'FAM'
inner join PRTR
on dmz.ceh_o = prtr.ceh_o and dmz.ceh_k = prtr.ceh_k
where dmz.kdmt = 'ДСЕ1' and mktsreg.n_kdk = t.C_KTHR
group by prtr.dlit),0 ) as sum_dd
from mktsreg
where cast(DATEADD(minute, -30, mktsreg.date_d) as date) BETWEEN @dateFrom AND @dateTo


Как пример, получается так:
date: 01-06-21 unmktsreg: 1234 sum_dd: 300
date: 01-06-21 unmktsreg: 5246 sum_dd: 300
date: 01-06-21 unmktsreg: 4875 sum_dd: 300


У Вас фактически две таблицы - одна синяя, а другая красная. И они не связаны не каким условием между собой. В красной части должно стоять ещё что-то типа and dmz.unmktsreg = mktsreg.unmktsreg после dmz.kdmt = 'ДСЕ1' and mktsreg.n_kdk = t.C_KTHR

PS Вообще какой-то мутный запрос. Удалите его и напишите заново, чем в этом разбираться ;)
...
Рейтинг: 0 / 0
Вывод записей
    #40080837
Raze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SIMPLicity_,
dmz мне нечем присоединить к mktsreg, поэтому и есть доп. характеристики, которые связывается с dmz, а потом с mktsreg.
может и правы, проще попробовать еще раз заново))
...
Рейтинг: 0 / 0
Вывод записей
    #40080894
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raze,

автор dlit (длительность) выводится несколько раз

Очевидно, это неверное утверждение, т.к. для каждой строки mktsreg формируется единственное значение prtr.dlit в указанном запросе.
...
Рейтинг: 0 / 0
Вывод записей
    #40080940
Raze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
не очень сейчас понял почему не верное утверждение..
Т.е. в mktsreg есть допустим 3 строки зарегистрированные на одного человека, выходит следующим образом:

date: 01-06-21 unmktsreg: 1234 n_kdk: 489 sum_dd: 300
date: 01-06-21 unmktsreg: 5246 n_kdk: 489 sum_dd: 300
date: 01-06-21 unmktsreg: 4875 n_kdk: 489 sum_dd: 300

Для все этих трех строк n_kdk одинаковый и далее получается, что mktsreg связывается с tthr по полю n_kdk
из-за этого sum_dd для всех строк какие есть проставляет одно и тоже значение

И как это ограничить, чтобы данные выводились только для одной строки, а не для всех, пока загадка) даже переделывая запрос, получается тоже самое...
...
Рейтинг: 0 / 0
Вывод записей
    #40080954
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raze,

а почему значение должно подставиться именно к записи с unmktsreg = 1234, а не к 5246, например?
...
Рейтинг: 0 / 0
Вывод записей
    #40080960
Raze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, это самая первая строка просто, но если было бы что-то вроде такого:

date: 01-06-21 unmktsreg: 1234 n_kdk: 489 sum_dd: 0
date: 01-06-21 unmktsreg: 5246 n_kdk: 489 sum_dd: 300
date: 01-06-21 unmktsreg: 4875 n_kdk: 489 sum_dd: 0

то против я вряд ли был :D
...
Рейтинг: 0 / 0
Вывод записей
    #40080962
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raze,

какая разница, сколько строк, Вы выбираете при помощи TOP 1 любую одну строку из этого списка.
...
Рейтинг: 0 / 0
Вывод записей
    #40080963
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raze,

ну добавь
case when row_number()over(partition by mktsreg.n_kdk order by mktsreg.unmktsreg) = 1
then твой_подзапрос
else 0
end
...
Рейтинг: 0 / 0
Вывод записей
    #40080964
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

ему, похоже, надо результаты подзапроса прилеплять не ко всем строкам запроса.
...
Рейтинг: 0 / 0
Вывод записей
    #40080966
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетитель,

в таком случае автор неверно задал вопрос, он должен был спросить - почему я вынужден писать TOP 1 в подзапросе? Ответ на этот вопрос можно получить путём анализа данных.
...
Рейтинг: 0 / 0
Вывод записей
    #40080969
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

top 1 тут вообще ни при чём.
он нужен совершенно по другой причине.
...
Рейтинг: 0 / 0
Вывод записей
    #40080971
Raze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, вот это номер, ни разу не приходилось пользоваться такой штукой.. Теперь верно выводится, одна строка имеет определенное значение, а остальные занулились

Большое человеческое всем спасибо! Особенно огромное Посетителю)
Надо будет поизучать данную схему на будущее
Код: sql
1.
case when ROW_NUMBER() over(PARTITION by  mktsreg.n_kdk order by mktsreg.unmktsreg) = 1
...
Рейтинг: 0 / 0
Вывод записей
    #40081004
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетитель
Владислав Колосов,

top 1 тут вообще ни при чём.
он нужен совершенно по другой причине.


Как раз причём, потому, что автор вынужденно это написал и получил последствия такого решения. Без TOP 1 у него будет набор данных {0,300,100500}. Он выбирает из этого набора первое попавшееся для каждой строки из mktsreg, а потом задает вопрос - "что я делаю не так?".
...
Рейтинг: 0 / 0
Вывод записей
    #40081012
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

что за фантазии?...
без top 1 запрос просто упадет в ошибку если вдруг в подзапросе окажется больше одной записи
а вопрос "почему в подзапросе может быть несколько записей" никак не относится к задаче "выводить результаты подзапроса только для одной из строк основного запроса".

Upd. при этом, схема в целом выглядит кривой, либо автор не знает о каких то связях.
...
Рейтинг: 0 / 0
Вывод записей
    #40081719
Raze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, возможно на первый взгляд так и есть)
Но на самом деле нет, т.к. это небольшая часть запроса от основного. Просто убрано все что могло мешать для чтения и понимая куска запроса
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вывод записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]