【发布时间】:2016-07-28 07:57:36
【问题描述】:
假设我有两个表PO 和PO_Line,我想列出PO 中的所有字段加上PO_Line 中链接回PO 中每一行的行数我会写一个查询像 -
SELECT
PO.propA,
PO.propB,
PO.propC,
PO.propD,
PO.propE,
...
PO.propY,
COUNT(PO_Line.propA) LINES
FROM
PO
LEFT JOIN
PO_Lines
ON
PO.ID = PO_Lines.PO_ID
显然,这会产生类似于 -
的错误选择列表中的“PO.propA”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
为了让查询运行,我将在查询末尾添加一个GROUP BY 子句,然后复制并粘贴我的选择行,就像这样 -
SELECT
PO.propA,
PO.propB,
PO.propC,
PO.propD,
PO.propE,
...
PO.propY,
COUNT(PO_Line.propA) LINES
FROM
PO
LEFT JOIN
PO_Lines
ON
PO.ID = PO_Lines.PO_ID
GROUP BY
PO.propA,
PO.propB,
PO.propC,
PO.propD,
PO.propE,
...
PO.propY
效果很好,但是感觉有点笨拙,尤其是如果我将列命名为 -
SELECT
PO.propA AS 'FIRST PROPERTY',
PO.propB AS 'SECOND PROPERTY',
PO.propC AS 'THIRD PROPERTY',
PO.propD AS 'ANOTHER PROPERTY',
PO.propE AS 'YOU GET THE IDEA',
...
PO.propY
我必须复制/粘贴 select 子句中的条目,然后删除列名。
所以我的问题是 - 是否有一种简写方法可以按 select 子句中找到的所有非聚合条目分组?
【问题讨论】:
-
您可以只对聚合列和非聚合键字段执行 SELECT,然后加入到其余非聚合字段的另一个 SELECT DISTINCT。这也很笨拙,但它的优点是允许您执行 SELECT *,而不是显式列出所有非聚合字段。
标签: sql sql-server sql-server-2008 tsql