Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Oracle查询转换为Sql Server查询_Sql_Sql Server_Oracle_Tsql - Fatal编程技术网

将Oracle查询转换为Sql Server查询

将Oracle查询转换为Sql Server查询,sql,sql-server,oracle,tsql,Sql,Sql Server,Oracle,Tsql,我试图在SSMS中运行此查询。问题是我返回了列创建日期、事务类型和记录类型,这很好,但当我在select查询计数(列1)中运行时,我得到以下错误 “表1.创建日期”列在选择列表中无效,因为 它既不包含在聚合函数中,也不包含在GROUP BY中 条款 关于我做错了什么,我是sql server新手,正在尝试转换此oracle查询,有什么想法吗 非常感谢计数是一个聚合函数,因此您需要根据其他内容进行分组: DECLARE @creation_date DATE , @transactio

我试图在SSMS中运行此查询。问题是我返回了列创建日期、事务类型和记录类型,这很好,但当我在select查询计数(列1)中运行时,我得到以下错误

“表1.创建日期”列在选择列表中无效,因为 它既不包含在聚合函数中,也不包含在GROUP BY中 条款

关于我做错了什么,我是sql server新手,正在尝试转换此oracle查询,有什么想法吗


非常感谢

计数是一个聚合函数,因此您需要根据其他内容进行分组:

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

这不是有效的SQL,就像在SQL语言中一样

如果要显示所有行中重复的总结果计数,在Oracle和SQL Server中,正确的方法是使用
OVER
子句并在窗口/分区上计算它。通常,
OVER
包含一个close,用于定义其应用的结果(按分区)。如果
OVER
子句为空,则对所有结果进行计算

您可以重写查询,使用
OVER()
计算并重复所有行的总计数:

select count(column_1) OVER() AS Volume,
      ...
from   table_1 
...
如果使用按记录类型划分的
子句,还可以计算每个记录类型的计数

select count(column_1) OVER(PARTITION BY record_type) AS Volume,
      ...
from   table_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()
    是一个字符串函数,因此应该传递字符串参数
  • 您需要
    分组依据
  • 计数(第1列)
    相当误导<由于
    where
    子句,code>column_1
从不为
NULL
,因此我建议
count(*)
count(1)
强调您是在计算行,而不是非
NULL

Oracle真的允许聚合函数而不需要像这样的分组吗?我一直对甲骨文的“未记录的功能”感到惊讶。你搜索过错误消息吗?这应该是您的第一步。可能的重复项不是有效的SQL,因为在SQL语言中。你确定这在Oracle中有效吗?
计数(第1列)
应该显示什么?每行重复的总计数?这不是
OVER()
子句的内容吗?请显示原始Oracle查询。很抱歉,这是上面查询中被遗漏的部分,在Oracle
和trunc(创建日期)>=to_date(?1,'DD/MM/YYYY')和trunc(创建日期)中都有效@VinnieS如果你有一个问题,但问了一些完全不同的问题,谁能帮你?发布完整的查询,而不是部分查询。顺便说一句,即使在Oracle中,也应该使用日期函数,而不是从和转换为字符串。所有这些转换和截断意味着Oracle/SQL Server必须扫描整个表以查找和组匹配entries@VinnieS在这两个数据库中,诀窍是不使用函数。使用日历表/日期维度,并为月份、年份使用额外的索引列。在日期字段中加入日历表,并按日历表的年、月列分组。服务器将仅拾取两个数据库中的匹配行。这样做的原因是基于一组日期参数生成报告,即(?1和?2)
trunc(@creation\u date)>=to\u date(?1,'DD/MM/yyyyy')和trunc(@creation\u date)感谢这项工作,我尝试按单个列分组,而不是返回所有其他内容,而不是计数列。
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');