Он не может рассчитать количество (*) в запросе к базе данных DB2 - PullRequest
0 голосов
/ 30 марта 2020

Я хочу сделать подсчет (*) количества строк в базе данных DB2. Основной запрос c выглядит следующим образом:

select 
SUBSTR("Request_Detail",LOCATE('/',"Request_Detail")+1,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)-LOCATE('/',"Request_Detail"))

 from "Request_Analisys"

 WHERE
 "Sample_Date_and_Time">=1200323230000000 and "Sample_Date_and_Time"<1200332300000000
 and "Request_Detail" <> '[Summary]'
 and "Request_Detail" not like 'WS:%'

Теперь я хотел бы сделать подсчет (*) полученных строк, но если я сделаю запрос, подобный этому:

select 
count(*),
SUBSTR("Request_Detail",LOCATE('/',"Request_Detail")+1,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)-LOCATE('/',"Request_Detail"))

 from "Request_Analisys"

 WHERE
 "Sample_Date_and_Time">=1200323230000000 and "Sample_Date_and_Time"<1200332300000000
 and "Request_Detail" <> '[Summary]'
 and "Request_Detail" not like 'WS:%'

Выдает ошибку:

18: 51: 58 FAILED [ВЫБОР - 0 строк, 0,032 с] 1) [Код: -119, SQL Состояние: 42803] Выражение, начинающееся с " Request_Detail ", указанный в предложении SELECT, предложении HAVING или предложении ORDER BY, не указан в предложении GROUP BY, или он содержится в предложении SELECT, предложении HAVING или предложении ORDER BY с функцией столбца, а условие GROUP BY не указано. . SQLCODE = -119, SQLSTATE = 42803, DRIVER = 4.22.29 2) [Код: -727, SQL Состояние: 56098] Произошла ошибка во время неявного действия системы типа "2". Информация, возвращаемая для ошибки, включает SQLCODE "-119", SQLSTATE "42803" и токены сообщений "Request_Detail" .. SQLCODE = -727, SQLSTATE = 56098, DRIVER = 4.22.29

Как можно получить количество строк?

Ответы [ 3 ]

0 голосов
/ 30 марта 2020

Это может сработать ...

select 
count(
SUBSTR("Request_Detail"
       ,LOCATE('/',"Request_Detail")+1
       ,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)
          -LOCATE('/',"Request_Detail")))
)
 from "Request_Analisys"
 WHERE
 "Sample_Date_and_Time">=1200323230000000 and "Sample_Date_and_Time"<1200332300000000
 and "Request_Detail" <> '[Summary]'
 and "Request_Detail" not like 'WS:%'

Но если нет, то это должно ..

with cte as (
select 
SUBSTR("Request_Detail"
       ,LOCATE('/',"Request_Detail")+1
       ,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)
          -LOCATE('/',"Request_Detail"))) as mydetail
 from "Request_Analisys"
 WHERE
 "Sample_Date_and_Time">=1200323230000000 and "Sample_Date_and_Time"<1200332300000000
 and "Request_Detail" <> '[Summary]'
 and "Request_Detail" not like 'WS:%'
)
select count(*) from cte
0 голосов
/ 31 марта 2020

Я предлагаю вам использовать REGEXP_EXTRACT, чтобы выбрать то, что вы хотите, из столбца "Request_Detail". Это более гибко, чем использование SUBSTR и LOCATE, и позволит избежать ошибки statement was not executed because a numeric argument of a scalar function is out of range..

например

select
    REGEXP_EXTRACT("Request_Detail",'.*/(.+/)',1,1,'',1)
,   SUBSTR("Request_Detail",LOCATE('/',"Request_Detail")+1,LOCATE('/',"Request_Detail",LOCATE('/',"Request_Detail")+1)-LOCATE('/',"Request_Detail"))
FROM TABLE(VALUES('aaaa/bbbb/ccc')) AS T("Request_Detail")

возвращает

1     |2    
------|-----
bbbb/ |bbbb/

, поэтому Вы можете сделать это

SELECT
    COUNT(*)
,   REGEXP_EXTRACT("Request_Detail",'.*/(.+/)',1,1,'',1)
FROM
     "Request_Analisys"
GROUP BY
    REGEXP_EXTRACT("Request_Detail",'.*/(.+/)',1,1,'',1)

, например

0 голосов
/ 30 марта 2020

Какую Request_Detail подстроку строки, по вашему мнению, она показывает после подсчета?
Если вы посчитаете строки, результирующий набор будет одной строкой, и использование каких-либо столбцов в нем не имеет смысла.

Если вам нужно несколько строк с подсчетом для каждого найденного подстрока, вам нужно GROUP BY этот подстрок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...