我正在从mysql转换为sql server。
转换选择存储过程时,
CREATE PROCEDURE selPropertyByAcntID
(
@in_acntID INT
)
AS
SELECT *
, SUM(CASE
WHEN u.prop_id IS NOT NULL THEN 1
ELSE 0
END) AS UnitCount
FROM
prop_details d
INNER JOIN
acnt_property a
ON
d.prop_id = a.prop_id
LEFT JOIN
unit_details u
ON
d.prop_id = u.prop_id
WHERE
a.group_id = @in_acntID
GROUP BY
d.prop_id;
抛出以下错误:
错误:8120严重级16 列'prop_details.prop_title'在选择列表中无效,因为它不是聚合函数或GROUP BY子句中的容器。
奇怪 - 完全相同的存储过程在mysql环境中工作。非常感谢任何帮助。
答案 0 :(得分:3)
在SQL Server和几乎所有RDBMS 除 MySQL之外,您只能在SELECT
列表中包含GROUP BY
列表中包含的项目或包含在聚合中的项目
因此要解决问题摆脱*
,请从表d
和a
中仅选择所需的列,并将此列表也添加到GROUP BY
答案 1 :(得分:1)
只是一个注释,与您的问题无关。这部分:
, SUM(CASE
WHEN u.prop_id IS NOT NULL THEN 1
ELSE 0
END) AS UnitCount
可以简化为:
, COUNT(u.prop_id) AS UnitCount
答案 2 :(得分:0)
使用SQL Server(我认为大多数RDBMS实际上......)GROUP BY
语句只能包含分组列和聚合函数。例如,这将起作用:
SELECT ColumnA, SUM(ColumnB) TotalCount
FROM Table
GROUP BY ColumnA;
但这不会:
SELECT ColumnA, ColumnC, ColumnD, SUM(ColumnB) TotalCount
FROM Table
GROUP BY ColumnA;
因为ColumnC
和ColumnD
未被分组。
答案 3 :(得分:0)
在您的选择中,您选择*
,但仅按prop_id
进行分组。如果您将*
更改为d.prop_id
,那么您应该感觉良好。如果您需要任何其他列,请在select和group by中指定它们。