Sql 使用条件聚合将值放入一行
我创建了一个视图来报告结果。我试图让所有的结果都显示在一行上。它们目前显示在每一行上。对于每个ID,如何将所有数据显示在一行上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
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中