2
Lab Test Name    Source Collected Date    Results
Urea             6/4/2013 12:00:00 AM           5
Uric Acid        6/4/2013 12:00:00 AM          10
Cholesterol      6/3/2013 12:00:00 AM          25

我有一个具有上述值的数据表。
我需要将其转换为以下结构:

                      Urea  Uric Acid   Cholesterol
6/4/2013 12:00:00 AM     5         10             -
6/3/2013 12:00:00 AM     -          -            25
4

2 回答 2

3

如果您查看 Mikael 链接的答案,您会意识到您需要动态地为您的数据透视语句构建列,因为 PIVOT 语法不允许在 FOR 子句中进行子选择。所以基本上你需要做这样的事情:

DECLARE
@cols AS NVARCHAR(MAX),
@y    AS INT,
@sql  AS NVARCHAR(MAX);

-- Construct the column list for the IN clause
-- e.g., [Urea],[Uric Acid],[Cholesterol]
SET @cols = STUFF(
(SELECT N',' + QUOTENAME(y) AS [text()]
FROM (SELECT DISTINCT (LabTestName) AS y FROM YourTable) AS Y
ORDER BY y
FOR XML PATH('')),
1, 1, N'');

您现在可以像这样构建您的 PIVOT 语句:

set @SQL = N'

SELECT   SourceCollectedDate,'+@cols+N' 
FROM    YourTable
PIVOT (
SUM(results) FOR LabTestName IN ( '+@cols+N')
) AS PivotTable
ORDER BY SourceCollectedDate desc
'

并执行它:

EXEC sp_executesql @sql

这将产生:

SourceCollectedDate     Urea    Uric Acid   Cholesterol
2013-06-04 00:00:00.000 5       10          NULL
2013-06-03 00:00:00.000 NULL    NULL        25

请注意,我的示例具有YourTable表名。您需要将其替换为您的实际表名。

SQL Fiddle(基于 Chad 创建的内容)

于 2013-06-04T14:23:42.347 回答
1

这是一个不需要pivot动态 SQL 的解决方案。权衡是您需要在查询中指定每个可能的实验室测试名称。

SELECT [Source Collected Date],
  MAX(CASE WHEN [Lab Test Name] = 'Urea'
      THEN Results ELSE NULL END) AS Urea,
  MAX(CASE WHEN [Lab Test Name] = 'Uric Acid'
      THEN Results ELSE NULL END) AS [Uric Acid],
  MAX(CASE WHEN [Lab Test Name] = 'Cholesterol'
      THEN Results ELSE NULL END) AS Cholesterol
FROM Table1
GROUP BY [Source Collected Date]

看到它在这里工作。

于 2013-06-04T14:26:26.827 回答