将Oracle查询隐藏到Sql Server查询

时间:2018-05-30 15:09:04

标签: sql sql-server oracle tsql

我正在尝试在SSMS中运行此查询问题是我返回列creation_date,transaction_type和RecordType这很好,但是当我在我的选择查询计数(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 server的新手,并试图转换这个oracle查询?

非常感谢

3 个答案:

答案 0 :(得分:2)

Count是一个聚合函数,因此您需要按其他所有内容进行分组:

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);

答案 1 :(得分:1)

你有一个非常神秘的查询。试试这个:

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)强调您计算行数,而不是非{{1} }}。值。

答案 2 :(得分:0)

这不是有效的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 
...