代码之家  ›  专栏  ›  技术社区  ›  Casey ScriptFu Pharr

如何对SQL中的子选定列进行分组依据

sql
  •  0
  • Casey ScriptFu Pharr  · 技术社区  · 6 年前

    例如,假设我正在执行此查询:

    SELECT 
       W.UserID, 
       W.Number,
       (SELECT StatusDate FROM WStatuses AS WS WHERE WS.Number = W.NUmber AND WS.StatusType = 'CRFI') AS StatusDate
       W.Model
    FROM WorkOrder AS W
    
    GROUP BY MONTH(StatusDate)
    

    我怎么能理解这种行为?有一个工作订单表和一个工作订单状态表。工作订单表每个工作订单编号有一个条目。WorkOrderStatus表具有该工作订单号的所有WorkOrderStatus更改的历史记录。所以我只知道它的状态变为CRFI的日期。然后我需要按返回的列中的月份分组,并说它不是有效的列。如有任何帮助,我们将不胜感激,并乐意为您编码!

    2 回复  |  直到 6 年前
        1
  •  2
  •   Derviş Kayımbaşıoğlu    6 年前

    可以使用子查询方法

    SELECT MONTH(StatusDate), sum(w.Number) num
    FROM
    (
      SELECT 
         W.UserID, 
         W.Number,
         (SELECT StatusDate FROM WStatuses AS WS WHERE WS.Number = W.NUmber AND WS.StatusType = 'CRFI') AS StatusDate
         W.Model
      FROM WorkOrder AS W
    ) T
    GROUP BY MONTH(StatusDate)
    

    替代方法(如果您确定只有一个记录将从带有筛选器的wstatus返回 CRFI )

    SELECT 
       avg(W.Number),
       MONTH(StatusDate)
    FROM WorkOrder AS W
    INNER JOIN Wstatuses 
      on WS.Number = W.NUmber AND WS.StatusType = 'CRFI'
    GROUP BY MONTH(StatusDate)
    
        2
  •  0
  •   Parfait    6 年前

    考虑避免相关子查询(计算 每一个 row)提高效率 JOIN . 此外,包括中列出的所有非聚合列 SELECT 条款纳入 GROUP BY 条款 对的 按照ANSI标准运行聚合查询的方法。并运行所需的聚合,如下面的调整所示。

    SELECT 
       W.UserID, 
       W.Number,
       MONTH(S.StatusDate) AS StatusMonth
       W.Model,
       COUNT(...) AS CountAgg,
       SUM(...) AS SumAgg,
       AVG(...) AS AvgAgg,
       ...
    FROM WorkOrder AS W
    INNER JOIN WStatuses AS S
      ON S.Number = W.NUmber AND S.StatusType = 'CRFI'
    
    GROUP BY W.UserID, 
             W.Number,      
             MONTH(S.StatusDate)
             W.Model