我正在尝试在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查询?
非常感谢
答案 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
...