组合行的SQL查询

组合行的SQL查询,sql,Sql,我有一个查询,它当前打印出我需要的内容,但不合并我需要的行。例如,我需要将具有仪表名称的前两行组合在一起,以此类推,以获得其余仪表名称 这就是我目前拥有的: SELECT --Displays Client Number CASE WHEN v.MID IS NULL THEN '' ELSE v.ClientNumber END AS 'Client Number', --Displays MID Number

我有一个查询,它当前打印出我需要的内容,但不合并我需要的行。例如,我需要将具有仪表名称的前两行组合在一起,以此类推,以获得其余仪表名称

这就是我目前拥有的:

SELECT      
    --Displays Client Number
    CASE
        WHEN v.MID IS NULL THEN ''
        ELSE v.ClientNumber
    END AS 'Client Number',

    --Displays MID Number
    CASE
        WHEN v.MID IS NULL THEN ''
        ELSE v.MID
    END AS MID,

    --Displays Meter Name
    CASE
        WHEN v.MID IS NULL THEN ''
        ELSE v.MeterName
    END AS 'Meter Name',
    /*
    CASE
        WHEN v.MID IS NULL THEN 0
        ELSE SUM(v.MCF)
    END AS MCF,
    */


    --Displays January's MCF
    CASE
        WHEN v.AccountPeriod = '2018-01-01' THEN SUM(v.MCF)
        ELSE 0
    END AS January,

    --Displays Febuary's MCF
    CASE
        WHEN v.AccountPeriod = '2018-02-01' THEN SUM(v.MCF)
        ELSE 0
    END AS Febuary,


    CASE
        WHEN v.MID IS NULL THEN 0
        ELSE SUM(v.mcf)
    END AS 'Meter Total'

FROM Volumes v
LEFT JOIN CurrentMeters cm 
    ON v.MID = cm.MID
WHERE cm.ClientNumber = 107500
GROUP BY v.MID, v.AccountPeriod, v.ClientNumber, v

有没有人对我应该做什么或如何做有什么建议?

我想你只需要条件聚合:

SELECT (CASE WHEN v.MID IS NULL THEN '' ELSE v.ClientNumber END) AS Client_Number,
       COALESCE(WHEN v.MID, '') as MID,
       (CASE WHEN v.MID IS NULL THEN '' ELSE v.MeterName END) AS Meter_Name,
      SUM((CASE WHEN v.MID IS NULL THEN 0 v.MCF END) AS MCF,
      SUM(CASE WHEN v.AccountPeriod = '2018-01-01' THEN v.MCF ELSE 0 END) AS January,
      SUM(CASE WHEN v.AccountPeriod = '2018-02-01' THEN v.MCF ELSE 0 END) AS January,
      SUM(CASE WHEN v.MID IS NULL THEN 0 ELSE v.mcf END) AS Meter_Total
FROM Volumes v JOIN
     CurrentMeters cm 
     ON v.MID = cm.MID
WHERE cm.ClientNumber = 107500
GROUP BY (CASE WHEN v.MID IS NULL THEN '' ELSE v.ClientNumber END),
         COALESCE(WHEN v.MID, ''),
        (CASE WHEN v.MID IS NULL THEN '' ELSE v.MeterName END);
注:

  • 您的
    WHERE
    子句将外部联接转换为内部联接,因此没有理由表示外部联接
  • groupby
    键指定结果集中定义行的内容。数据中唯一值的每个组合正好位于一行中。因此,您不希望
    AccountPeriod
    位于
    分组依据中
  • 大概,您希望定义一行的每个表达式都有一行,因此这些表达式位于
    group by
  • 对于条件聚合,
    CASE
    表达式是聚合函数的参数,例如
    SUM()

非常感谢您。我现在明白你在这里做什么了。让它完美地工作。肯定需要更多地研究聚合条件。快速提问:我在上一个求和案例中遇到了一个错误。它说:“无法对包含聚合或子查询的表达式执行聚合函数。”我不明白为什么这里会发生错误。@bgrow11。那是一个打字错误(“抄袭”)。聚合函数不应嵌套。再次感谢您的帮助。最后一个问题是,我是否要创建一行,其中包含一月和二月每个MeterName的总和。我有一个列,每行有一个和,但我需要一行中每个MeterName的每列和。我曾尝试使用我对MCF列求和的方法,但我得到了一个分组错误。