2016-10-04 2 views
0

Я пытаюсь вернуться в службу отчетов, счет ID и NUM, которые имеют пользовательский идентификатор USERID AND CREATION_DATE, введенный пользователем. Моя цель - получить одну строку в результате, содержащую оба счета. Я получаю правильный счет, но я показываю несколько строк, как возвращение. (которые являются строками, которые имеют параметры, заданные пользователем). Как я могу получить только одну строку, содержащую только поля COUNTID и COUNTNUM. Я использую сервер SQL sql.Правильный синтаксис запроса Sql

SELECT 

    (SELECT COUNT(ID) 
     FROM PART 
     WHERE USERID = $P{userId} and CREATION_DATE = $P{creationDate}) as COUNTID , 
    (SELECT COUNT(NUM) 
     FROM IDENTITY 
     WHERE USERID = $P{userId} and CREATION_DATE = $P{creationDate}) as COUNTNUM 
FROM 
     PART, 
     IDENTITY 
+1

Попробуйте удалить предложение 'FROM', если ваша база данных базы данных - это SQL Server или вместо' FROM DUAL', если это Oracle. – Unoembre

+1

Не могли бы вы указать, какой механизм БД вы используете? – Gasper

+0

Может ли один или оба значения COUNT когда-либо равняться нулю? Некоторые из предложенных ответов не будут работать, если это так. – Unoembre

ответ

1

Если вы хотите вернуть одну строку, и каждый из ваших подзапросов возвращается «счетчик» вы хотите, вы можете просто удалить статью FROM из внешнего запроса. Что-то вроде этого:

SELECT (SELECT COUNT(p.ID) 
      FROM PART p 
      WHERE p.USERID  = $P{userId} 
       AND p.CREATION_DATE = $P{creationDate} 
     ) AS COUNTID 
     , (SELECT COUNT(i.NUM) 
      FROM IDENTITY i 
      WHERE i.USERID  = $P{userId} 
       AND i.CREATION_DATE = $P{creationDate} 
     ) AS COUNTNUM 

Лично я бы написал запрос немного по-другому. Я бы использовал подзапросы, как встроенные виды креста, объединенные в предложение FROM, причем каждый из встроенных представлений возвращал одну строку. Например:

SELECT cp.countid 
     , ci.countnum 
    FROM (SELECT COUNT(p.ID) AS countid 
      FROM PART p 
      WHERE p.USERID  = $P{userId} 
       AND p.CREATION_DATE = $P{creationDate} 
     ) cp 
    CROSS 
    JOIN (SELECT COUNT(i.NUM) AS countnum 
      FROM IDENTITY i 
      WHERE i.USERID  = $P{userId} 
       AND i.CREATION_DATE = $P{creationDate} 
     ) ci 
+0

Обратите внимание, что подзапросы гарантированно возвращают строку. Даже если никакие строки, удовлетворяющие предикатам, агрегат COUNT() все равно будет возвращать 0. Оба запроса в этом ответе будут возвращать «нулевые» подсчеты. – spencer7593

0

Используйте присоединиться и Group By - как это:

SELECT P.USERID, P.CREATION_DATE, COUNT(P.ID) AS COUNTID, COUNT(I.NUM) AS COUNTNUM 
FROM PART P 
JOIN IDENTITY I ON P.USERID = I.USERID AND P.CREATION_DATE = I.CREATION_DATE 
WHERE P.USERID = $P{userId} and P.CREATION_DATE = $P{creationDate} 
GROUP BY P.USERID, P.CREATION_DATE 

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

Обратите внимание, если не все пользователи и даты в PART таблицы или идентификационной таблицы сделать это:

SELECT B.USERID, B.CREATION_DATE, COUNT(P.ID) AS COUNTID, COUNT(I.NUM) AS COUNTNUM 
FROM (
    SELECT DISTINCT USERID, CREATEION_DATE FROM PART 
    UNION 
    SELECT DISTINCT USERID, CREATEION_DATE FROM IDENTITY 
) AS B 
LEFT JOIN PART P ON B.USERID = P.USERID AND B.CREATION_DATE = P.CREATION_DATE 
LEFT JOIN IDENTITY I ON B.USERID = I.USERID AND B.CREATION_DATE = I.CREATION_DATE 
WHERE B.USERID = $P{userId} and B.CREATION_DATE = $P{creationDate} 
GROUP BY B.USERID, B.CREATION_DATE 

ПРИМЕЧАНИЕ: Этот второй запрос является более правильным много, но не могут быть необходимы в зависимости по вашим данным. Поскольку вы ничего не рассказываете нам о своих данных или модели данных, мне сложно знать, будет ли работать первый запрос.

+0

Дорогая, когда дело доходит до вашего второго решения, я получаю один ряд. однако для графа вместо того, чтобы получить 1,7, что является моим правильным решением ... Я получаю 14 за каждый счет – user243837

+0

@ user243837 - попробуйте изменить 'UNION ALL' на' UNION'. Если это не сработает, мне нужно будет увидеть ваши данные выборки, чтобы выяснить, что не так. – Hogan

+0

, сделав это, теперь счет COUNTID 7 COUNTNUM 7 .. Countnum правильный, однако countid должен быть 1 .. – user243837

Смежные вопросы