Скрытый запрос Oracle к запросу Sql Server - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь выполнить этот запрос в SSMS, проблема в том, что я получаю возвращенные столбцы creation_date ,action_type и RecordType, что нормально, но когда я запускаю в моем запросе select count (column_1), я получаю следующую ошибку

Столбец 'table_1.CREATION_DATE' недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

DECLARE   @creation_date date
        , @transaction_type varchar
        , @record_type int
        , @column_1 varchar

select count(column_1) AS Volume
       ,JudgmentMonth=RIGHT(REPLACE(CONVERT(VARCHAR(7), creation_date, 103), '/', ''), 7)
       ,transaction_type, 
       REPLACE(record_type, 3, 2) as RecordType  
from   table_1 
where  transaction_type = 'PG' 
and    column_1 = 'CCJ' 

Любые идеи о том, что яя делаю что-то не так, я новичок на сервере sql и пытаюсь преобразовать этот оракул-запрос?

Большое спасибо

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Это недопустимый SQL, как в языке SQL.

Если вы хотите отобразить общее количество результатов, повторенное во всех строках, в Oracle и SQL Server правильным способом будет использование OVER предложение и рассчитать его по окну / разделу.Как правило, OVER содержит закрытие, которое определяет результаты, к которым он применяется (PARTITION BY).Если предложение OVER пусто, оно рассчитывается по всем результатам.

Вы можете переписать свой запрос, чтобы использовать OVER() для вычисления и повторения общего количества во всех строках:

select count(column_1) OVER() AS Volume,
      ...
from   table_1 
...

Вы также можете рассчитать количество для каждого типа записи, если используете PARTITION BY record_type пункт

select count(column_1) OVER(PARTITION BY record_type) AS Volume,
      ...
from   table_1 
...
0 голосов
/ 30 мая 2018

У вас очень загадочный запрос.Попробуйте это:

select count(column_1) AS Volume, month(creation_date) as JudgmentMonth, transaction_type, 
       replace(record_type, '3', '2') as RecordType  
from table_1 
where transaction_type = 'PG' and column_1 = 'CCJ' 
group by month(creation_date), transaction_type, replace(record_type, '3', '2');

Примечания:

  • month() гораздо удобнее, чем сложное выражение, которое вы используете (хотя оно возвращает число, а не строку с нулем).
  • replace() - строковая функция, поэтому вы должны передавать строковые аргументы.
  • вам нужен group by.
  • count(column_1) довольно вводит в заблуждение.column_1 никогда не является NULL из-за предложения where, поэтому я рекомендую count(*) или count(1), чтобы подчеркнуть, что вы подсчитываете строки, а не значения NULL.
0 голосов
/ 30 мая 2018

Счетчик - агрегатная функция, поэтому вам нужно сгруппировать все остальное:

DECLARE @creation_date DATE
      , @transaction_type VARCHAR
      , @record_type INT
      , @column_1 VARCHAR;

SELECT COUNT(column_1) AS Volume
     , RIGHT(REPLACE(CONVERT(VARCHAR(7), creation_date, 103), '/', ''), 7) AS JudgmentMonth
     , transaction_type
     , REPLACE(record_type, 3, 2) AS RecordType
FROM table_1
WHERE transaction_type = 'PG'
      AND column_1 = 'CCJ'
GROUP BY RIGHT(REPLACE(CONVERT(VARCHAR(7), creation_date, 103), '/', ''), 7)
       , transaction_type
       , REPLACE(record_type, 3, 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...