按MSSQL中的所有非聚合列进行分组

时间:2016-04-07 12:24:49

标签: sql sql-server sql-server-2008 tsql

假设我有两个表POPO_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'在选择列表中是invaalid,因为它不包含在聚合函数或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子句中的所有非聚合条目来表示组?

3 个答案:

答案 0 :(得分:2)

我认为你只想要窗口功能:

SELECT . . .,
       COUNT(PO_Line.propA) OVER (PARTITION BY PO.ID) as LINES
FROM PO LEFT JOIN
     PO_Lines
     ON PO.ID = PO_Lines.PO_ID;

答案 1 :(得分:1)

  

我必须复制/粘贴select子句中的条目,然后删除列名。

我强烈建议您使用block/column selection。将,作为第一个元素移动并对齐别名:

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
  ,COUNT(PO_Line.propA) LINES
FROM  PO
LEFT JOIN  PO_Lines
  ON  PO.ID = PO_Lines.PO_ID
GROUP BY
   ...

enter image description here

SQL Server Management Studio中使用简单块选择 SHIFT + ALT 突出显示并粘贴。

如果您正在使用其他编辑器,请找到相应的keyshortcut here

如同添加架构,别名等等,可以立即进行多次编辑。

答案 2 :(得分:1)

阅读您的查询我认为您可能不需要GROUP BY开头:

SELECT
  PO.propA,
  PO.propB,
  PO.propC,
  PO.propD,
  PO.propE,
  ...
  PO.propY,
  (SELECT COUNT(*) FROM PO_Lines WHERE PO.ID = PO_Lines.PO_ID) LINES
FROM
  PO