Sql 使用条件聚合将值放入一行

Sql 使用条件聚合将值放入一行,sql,sql-server,Sql,Sql Server,我创建了一个视图来报告结果。我试图让所有的结果都显示在一行上。它们目前显示在每一行上。对于每个ID,如何将所有数据显示在一行上 IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'PBI_TrendData_VW') DROP VIEW PBI_TrendData_VW GO Create view dbo.PBI_TrendData_VW a

我创建了一个视图来报告结果。我试图让所有的结果都显示在一行上。它们目前显示在每一行上。对于每个ID,如何将所有数据显示在一行上

IF EXISTS (SELECT TABLE_NAME 
       FROM   INFORMATION_SCHEMA.VIEWS 
       WHERE  TABLE_NAME = N'PBI_TrendData_VW')
    DROP VIEW PBI_TrendData_VW
GO
Create view dbo.PBI_TrendData_VW as

     SELECT distinct 
    Orders.Ordno as [ID#],
    CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(100-convert(float,Results.rn2))) END [Moi],
    CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn2))) END [DM1],
    CASE WHEN Analyte = 'CP' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn1))) END [Protein]
 FROM   (((FOLDERS 
 INNER JOIN ORDERS ON FOLDERS.FOLDERNO=ORDERS.FOLDERNO) 
 INNER JOIN RESULTS ON ORDERS.ORDNO=RESULTS.ORDNO))
 WHERE  RESULTS.SA='Released'  
 GROUP BY ORDERS.ORDNO, Results.RN1, Results.Rn2, Results.Final, results.analyte

 GO
当前成果:

|ID# | Moi | Dm1 | Protein |
|1   | 50  | Null|    Null |
|1   |Null | 50  |    Null |
|1   |Null | 50  |    22.4 |
|2   |Null | 25  |    Null |
|2   |75   |Null |    Null |
|2   |Null |Null |    32.4 |
预期成果:

|ID# | Moi | Dm1 | Protein |
|1   | 50  | 50  |    22.4 |
|2   |75   | 25  |    32.4 |

使用最大聚集门函数

IF EXISTS (SELECT TABLE_NAME 
       FROM   INFORMATION_SCHEMA.VIEWS 
       WHERE  TABLE_NAME = N'PBI_TrendData_VW')
    DROP VIEW PBI_TrendData_VW
GO
Create view dbo.PBI_TrendData_VW as

     SELECT  
    Orders.Ordno as [ID#],
   max( CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(100-convert(float,Results.rn2))) END) [Moi],
    max(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn2))) END) [DM1],
   max( CASE WHEN Analyte = 'CP' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn1))) END) [Protein]
 FROM   (((FOLDERS 
 INNER JOIN ORDERS ON FOLDERS.FOLDERNO=ORDERS.FOLDERNO) 
 INNER JOIN RESULTS ON ORDERS.ORDNO=RESULTS.ORDNO))
 WHERE  RESULTS.SA='Released'  
 GROUP BY ORDERS.ORDNO

 GO

使用最大聚集门函数

IF EXISTS (SELECT TABLE_NAME 
       FROM   INFORMATION_SCHEMA.VIEWS 
       WHERE  TABLE_NAME = N'PBI_TrendData_VW')
    DROP VIEW PBI_TrendData_VW
GO
Create view dbo.PBI_TrendData_VW as

     SELECT  
    Orders.Ordno as [ID#],
   max( CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(100-convert(float,Results.rn2))) END) [Moi],
    max(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn2))) END) [DM1],
   max( CASE WHEN Analyte = 'CP' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn1))) END) [Protein]
 FROM   (((FOLDERS 
 INNER JOIN ORDERS ON FOLDERS.FOLDERNO=ORDERS.FOLDERNO) 
 INNER JOIN RESULTS ON ORDERS.ORDNO=RESULTS.ORDNO))
 WHERE  RESULTS.SA='Released'  
 GROUP BY ORDERS.ORDNO

 GO

你需要聚合。我认为:

SELECT o.Ordno as [ID#],
       MAX(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(100-convert(float,Results.rn2))) END) as [Moi],
       MAX(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn2))) END) as [DM1],
       MAX(CASE WHEN Analyte = 'CP' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn1))) END) as [Protein]
FROM FOLDERS f JOIN
     ORDERS o
     ON f.FOLDERNO = o.FOLDERNO JOIN
     RESULTS r
     ON o.ORDNO = r.ORDNO
WHERE r.SA = 'Released'  
GROUP BY o.ORDNO;
我不知道为什么在这种情况下会有多次转换。我给他们留了张便条,他们可能不需要

请注意,表别名使查询更易于编写和读取


使用GROUP BY选择DISTINCT几乎从来都不合适。GROUP BY中的列应该是定义结果集中一行外观的键。在您的情况下,o.Ordno.

您需要聚合。我认为:

SELECT o.Ordno as [ID#],
       MAX(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(100-convert(float,Results.rn2))) END) as [Moi],
       MAX(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn2))) END) as [DM1],
       MAX(CASE WHEN Analyte = 'CP' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn1))) END) as [Protein]
FROM FOLDERS f JOIN
     ORDERS o
     ON f.FOLDERNO = o.FOLDERNO JOIN
     RESULTS r
     ON o.ORDNO = r.ORDNO
WHERE r.SA = 'Released'  
GROUP BY o.ORDNO;
我不知道为什么在这种情况下会有多次转换。我给他们留了张便条,他们可能不需要

请注意,表别名使查询更易于编写和读取


使用GROUP BY选择DISTINCT几乎从来都不合适。GROUP BY中的列应该是定义结果集中一行外观的键。在您的例子中,o.Ordno.

您是根据查询中的每个返回值进行分组的,所以您似乎不知道GROUPBY是如何工作的。您需要在CASE表达式周围放置一个聚合,并从GROUP BY中删除列。猜测一下:

SELECT Orders.Ordno as [ID#],
       MAX(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(100-convert(float,Results.rn2))) END) [Moi],
       MAX(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn2))) END) [DM1],
       MAX(CASE WHEN Analyte = 'CP' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn1))) END) [Protein]
 FROM FOLDERS 
      INNER JOIN ORDERS ON FOLDERS.FOLDERNO=ORDERS.FOLDERNO
      INNER JOIN RESULTS ON ORDERS.ORDNO=RESULTS.ORDNO
 WHERE  RESULTS.SA='Released'  
 GROUP BY ORDERS.ORDNO;

此外,不需要将对象包装在括号中的FROM中。

您是根据查询中的每个返回值进行分组的,所以您似乎不知道GROUP by是如何工作的。您需要在CASE表达式周围放置一个聚合,并从GROUP BY中删除列。猜测一下:

SELECT Orders.Ordno as [ID#],
       MAX(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(100-convert(float,Results.rn2))) END) [Moi],
       MAX(CASE WHEN Analyte = 'DM1' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn2))) END) [DM1],
       MAX(CASE WHEN Analyte = 'CP' THEN CONVERT(DECIMAL(10,2),(convert(float,Results.rn1))) END) [Protein]
 FROM FOLDERS 
      INNER JOIN ORDERS ON FOLDERS.FOLDERNO=ORDERS.FOLDERNO
      INNER JOIN RESULTS ON ORDERS.ORDNO=RESULTS.ORDNO
 WHERE  RESULTS.SA='Released'  
 GROUP BY ORDERS.ORDNO;
此外,不需要将对象包装在括号中的FROM中