powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите с запросом
21 сообщений из 21, страница 1 из 1
Помогите с запросом
    #38841406
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!

Помогите реализовать запрос. Есть таблица (ACOUNTS) с полями ID человека (MAN_ID), Номер счета (ACCOUNT). У одного человека может быть несколько счетов в этой таблице. Нужен скрипт, который покажет счета, которые принадлежат одновременно разным людям (людей тоже показать). Чувствую, что это просто, но пока ничего не приходит в голову. Спасибо

С уважением, Семен Попов
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841510
vitabios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov,
А можно подробнее структуру этой таблицы?
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841528
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен, что правильно понял
Если у вас структура данных такая: Contragents(контрагенты), Accounts(счета), LinkContragentAccount(связь счетов и контрагентов), то можно попробовать так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WITH DoubleAccounts AS
(
  SELECT L.Account_ID
 FROM LinkContragentAccount
GROUP BY L.Account_ID
HAVING COUNT(Account_ID)>1
)

SELECT * FROM LinkContragentAccount L WHERE EXISTS
(
  SELECT 1 FROM DoubleAccounts D WHERE L.Account_ID=D.Account_ID 
)
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841729
n&n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
n&n
Гость
Semen Popov,

такое?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
> db2 "with accounts(man_id, account) as (values (100,'account_1'),(101,'account_2'),(102, 'account_1'),(103,'account_3'),(104,'account_3'))
select account, substr(listagg(cast(man_id as char(5)),','),1,50) as persons from accounts group by account having count(man_id)>1"

ACCOUNT   PERSONS
--------- --------------------------------------------------
account_1 100  ,102
account_3 103  ,104

  2 record(s) selected.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841817
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitabios, я думаю, вы знаете таблицу PAYSUM.RECIPIENT_FILE очень известного нам приложения.

londinium, немного не то. Структура таблицы такова, что в ней содержится ID человека(char(30)) и сам номер счета (varchar(40)). По одному ID человека в таблице может быть несколько записей повторяющихся с одним и тем же счетом, а может быть и записи с разными счетами у одного ID человека. Но интересуют счета, если они в этой таблице принадлежат разным людям, то есть один и тот же счет может сидеть в таблице с разным ID человека.

n&n, это уже ближе. Но тут будет проблема, если в таблице несколько одинаковых записей по MAN_ID и ACCOUNT, а такое допускается. Например, когда запись (100, 'Account_1') сидит в таблице дважды, и тогда запрос выдаст счет Account_1, даже если этот счет не принадлежит другому человеку.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841841
Semen Popov,

Что-то типа такого?
Код: sql
1.
2.
3.
select distinct account,man_id from accounts 
where account in ( select account from accounts group by account having count(man_id)>1) 
order by account
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841860
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя думаю, вы знаете таблицу PAYSUM.RECIPIENT_FILE очень известного нам приложения.
Не томите, расскажите, что за приложение.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841888
n&n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
n&n
Гость
Semen PopovНо тут будет проблема, если в таблице несколько одинаковых записей по MAN_ID и ACCOUNT

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with accounts0(man_id, account) as 
(values (100,'account_1'),(101,'account_2'),(101,'account_2'),(102, 'account_1'),(103,'account_3'),(104,'account_3')), 
accounts1(sint) as (select distinct man_id||'#'||account from accounts0), 
accounts2(man_id, account) as (select substr(sint,1,posstr(sint,'#')-1) as man_id, substr(sint,posstr(sint,'#')+1,length(sint)) 
   from accounts1) 
select account, substr(listagg(cast(man_id as char(5)),','),1,50) as persons 
   from accounts2 group by account having count(man_id)>1

ACCOUNT               PERSONS
--------------------- --------------------------------------------------
account_1             100  ,102
account_3             103  ,104

  2 record(s) selected.



хотя можно и не так громоздко и коряво
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841977
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
londiniumавторя думаю, вы знаете таблицу PAYSUM.RECIPIENT_FILE очень известного нам приложения.
Не томите, расскажите, что за приложение.Нормы безопасности, под которыми я подписывался, не позволяют мне это сделать.

Евгений Хабаров, не подходит. Выводит и те записи счетов, которые относятся только к одному гражданину.

n&n, громоздковато. Но попробую взять вашу идею
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841984
Semen Popov,
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * 
  from (
          select t.*, 
                 count(distinct MAN_ID) over(partition by ACCOUNT) as cnt
            from ACOUNTS
          ) v
 where cnt > 1
...
Рейтинг: 0 / 0
Помогите с запросом
    #38841987
Добрый Э - ЭхSemen Popov,
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * 
  from (
         select t.*, 
                count(distinct MAN_ID) over(partition by ACCOUNT) as cnt
           from ACCOUNTS t
       ) v
 where cnt > 1
...
Рейтинг: 0 / 0
Помогите с запросом
    #38842073
knudsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
столько можно способов придумать...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
/*
CREATE TABLE TMP.A( A1 INTEGER, A2 INTEGER);

-- A1 = MAN_ID
-- A2 = ACCOUNT

INSERT INTO TMP.A VALUES(1, 1);
INSERT INTO TMP.A VALUES(1, 1);
INSERT INTO TMP.A VALUES(1, 2);
INSERT INTO TMP.A VALUES(2, 1);
INSERT INTO TMP.A VALUES(2, 3);
INSERT INTO TMP.A VALUES(3, 3);
*/

WITH 
S13 (A1, A2)  AS (SELECT  DISTINCT A1, A2 FROM TMP.A), 
S24 (A2, CNT) AS (SELECT A2,COUNT(*) CNT FROM S13 GROUP BY A2 HAVING COUNT(*)>1)
SELECT S13.* FROM S13  INNER JOIN S24 ON S24.A2 = S13.A2;



результат:
Код: html
1.
2.
3.
4.
5.
A1	A2
1	1
2	1
2	3
3	3
...
Рейтинг: 0 / 0
Помогите с запросом
    #38842091
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхДобрый Э - ЭхSemen Popov,
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * 
  from (
         select t.*, 
                count(distinct MAN_ID) over(partition by ACCOUNT) as cnt
           from ACCOUNTS t
       ) v
 where cnt > 1


DISTINCT нельзя с OLAP функциями.

как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with ACCOUNTS (MAN_ID, ACCOUNT) AS (VALUES
  (1, '1')
, (1, '2')
, (1, '2')
, (2, '2')
, (2, '3')
, (3, '4')
, (3, '4')
)
SELECT ACCOUNT, VARCHAR(LISTAGG(MAN_ID, ','), 10) MAN_IDS
FROM (
SELECT DISTINCT A.ACCOUNT, A.MAN_ID
FROM ACCOUNTS A
JOIN (
SELECT ACCOUNT
FROM ACCOUNTS
GROUP BY ACCOUNT
HAVING COUNT(DISTINCT MAN_ID) > 1
) G ON G.ACCOUNT=A.ACCOUNT
) 
GROUP BY ACCOUNT

ACCOUNT MAN_IDS   
------- ----------
2       1,2       

...
Рейтинг: 0 / 0
Помогите с запросом
    #38842105
Mark BarinsteinDISTINCT нельзя с OLAP функциями.что ли в IBM пошли а разрез со стандартами ANSI-SQL ?
В Оракле можно, в MS SQL Server можно, а в тут нельзя?
...
Рейтинг: 0 / 0
Помогите с запросом
    #38842125
Добрый Э - ЭхMark BarinsteinDISTINCT нельзя с OLAP функциями.что ли в IBM пошли а разрез со стандартами ANSI-SQL ?
В Оракле можно, в MS SQL Server можно, а в тут нельзя?
раз прямолинейно и безхитростно решить не получается, то можно сделать небольшой финт ушами:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select * 
  from (
         select t.*, 
                max(MAN_ID) over(partition by ACCOUNT) as x_max,
                min(MAN_ID) over(partition by ACCOUNT) as x_min
           from ACCOUNTS t
       ) v
 where x_max != x_min
...
Рейтинг: 0 / 0
Помогите с запросом
    #38842184
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, забыл предупредить, что DB2 WSE 9.7.6.
На функцию LISTAGG (из скрипта Марка и n&n) ругается
Код: plsql
1.
2.
SQL0440N  Не найдено доступной подпрограммы "LISTAGG" типа "FUNCTION" с 
совместимыми аргументами.  SQLSTATE=42884



Еще раз про структуру таблицы ACCOUNTS - MAN_ID char(30), ACCOUNT varchar(40).

Всем спасибо. Будем пробовать.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38842463
Semen PopovЕвгений Хабаров, не подходит. Выводит и те записи счетов, которые относятся только к одному гражданину.

Если у вас дублирующие записи по одному и тому же человеку, то тогда чуть сложнее
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select distinct account,man_id from accounts
where account in 
( 
  select account from 
  (
    select distinct account,man_id from accounts
  ) 
  group by account having count(man_id)>1
) 
order by account
...
Рейтинг: 0 / 0
Помогите с запросом
    #38842593
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхMark BarinsteinDISTINCT нельзя с OLAP функциями.что ли в IBM пошли а разрез со стандартами ANSI-SQL ?
В Оракле можно, в MS SQL Server можно, а в тут нельзя?
Да, похоже на то.

Добиться count distinct можно, но несколько сложнее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select DISTINCT ACCOUNT, MAN_ID
from (
select ACCOUNT, MAN_ID, MAX(DENSE_RANK() OVER (PARTITION BY ACCOUNT ORDER BY MAN_ID)) OVER (PARTITION BY ACCOUNT) CNT_DISTINCT
from ACCOUNTS
)
where CNT_DISTINCT>1
order by ACCOUNT


Semen PopovРебята, забыл предупредить, что DB2 WSE 9.7.6.
На функцию LISTAGG (из скрипта Марка и n&n) ругается

Код: sql
1.
2.
SQL0440N  Не найдено доступной подпрограммы "LISTAGG" типа "FUNCTION" с 
совместимыми аргументами.  SQLSTATE=42884

Это просто удобная ф-ция для склеивания связанных значений. Если ее нет, можно пользоваться запросом выше.
Ф-ция появилясь в 9.7.4, и если ее нет, то вы, вероятно, при накате фикспака не сделали:
Код: plaintext
db2updv97 -d mydb
поэтому у вас она и не появилась.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38843240
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо. Все получилось
...
Рейтинг: 0 / 0
Помогите с запросом
    #38844367
vitabios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov,

Эх жаль не успел посмотреть. Не было на работе несколько дней. В понедельник обязательно посмотрю , самому интересно разобраться.
...
Рейтинг: 0 / 0
Помогите с запросом
    #38844369
vitabios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov,

Приложение я сразу догадался какое, только в тот день таблицу не нашел.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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