SQL列到行-用于视图

SQL列到行-用于视图,sql,sql-server,Sql,Sql Server,我有一个观点,这个观点是正确的 ID INQCLASS INQDETAIL Period BAL 1233 GROSS water 12-3-2017 233.32 1233 GROSS ENergy 12-3-2017 122.00 ID,INQCLASS,周期相同。除了INQDETAIL和BAL之外 我想把它合并成一行,显示水和能量平衡 任何建议都会有帮助。多谢各位 SELECT ID,

我有一个观点,这个观点是正确的

ID       INQCLASS  INQDETAIL     Period      BAL
1233     GROSS      water     12-3-2017     233.32
1233     GROSS      ENergy    12-3-2017     122.00
ID,INQCLASS,周期相同。除了INQDETAIL和BAL之外 我想把它合并成一行,显示水和能量平衡

任何建议都会有帮助。多谢各位

SELECT ID, 
    INQCLASS, 
    Period, 
    MAX(CASE WHEN INQDETAIL = 'water' then BAL else 0 end) as WaterBal,
    MAX(CASE WHEN INQDETAIL = 'ENergy' then BAL else 0 end) as ENergyBal
FROM View_Name
GROUP BY ID, INQLASS, Period
case语句仅用于在满足条件时显示BAL。因此,单独使用case,每个项目仍然会返回两行,但其中一行有Waterbal值,没有energybal值,另一行则相反

执行GROUP BY时,每个字段都必须位于GROUP BY列表中(在本例中为ID、INQCLASS、Period),或者具有聚合函数,如SUM、MAX、COUNT等(在本例中,Waterbal和energyBal具有聚合函数)


在本例中,GROUP BY将公共ID INQLASS句点折叠为单行,然后获取Waterbal和energyBal的最大(MAX)值。因为一个始终为0,所以它只提供另一个。

尝试以下方法:

SELECT INQDETAIL
, PERIOD
, SUM(BAL) AS energy_Bal       
FROM your_view
WHERE INQDETAIL LIKE 'water'
GROUP BY INQDETAIL
, PERIOD;     

一个简单的透视表应该可以做到这一点。只要您提前知道Inqdetail值:

select ID,
     INQCLASS, 
     [Period], 
     [Water] AS [Water Bal],
     [Energy] as [Energy Bal]
from
(
    select [ID], 
        [INQCLASS], 
        [INQDETAIL], 
        [Period], 
        [BAL] 
    from #util
) As Utilities
PIVOT
(
  SUM([BAL])
  FOR [inqdetail] IN ([Water],[Energy])
 ) AS Pvttbl
试试这个:

SELECT *
FROM 
     (SELECT * FROM #temp) AS P
PIVOT
(
   max(bal) FOR INQDETAIL IN ([water], [ENergy])
) AS pv1

提示:
GROUP BY
。我使用了GROUP BY,但获取错误我不知道如何使用类似这样的数据透视获取错误。它不包含在聚合函数中,或者GROUP BY子句在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。谢谢,先生。太有用了。这是第一个完美的答案,但最好有一些描述。谢谢你的帮助。它给我相同的输出即使您的代码解决了OP问题,建议您在代码段中添加一些描述性文本。