Ada*_*der 5 sql sql-server pivot
这是我第一次尝试使用 PIVOT。我正在使用 Microsoft SQL Server。
所以这是我的问题,我一直在阅读 Pivot 并决定它将非常适合将患者数据导出到格式化文件(即报告)的项目,该文件可以打印出来等等。
VPatientPlusAllergyData 是一个视图,将其显示为示例结果,并删除了一些数据以便于阅读
strPatientFullName strAllergy strAllergyMedication
------------------------------------------------------------
Smith, John Henry Dogs Pounces
Smith, John Henry Dogs Orange Juice
Smith, John Henry Mustard Ketchup
Smith, John Henry Mustard Sugar
Run Code Online (Sandbox Code Playgroud)
这就是我想要的结果
strPatientFullName strAllergy1 strAllergy1Medications strAllergy2 strAllergy2Medications
------------------------------------------------------------------------------------------------------
Smith, John Henry Dogs Pounces, OrangeJuice Mustard Ketchup, Sugar
Run Code Online (Sandbox Code Playgroud)
在阅读 W3Schools、观看 Youtube 视频、甚至阅读该网站上的一些文章后,我想知道我想做的事情是否可行
下面是一个代码片段,但当我开始质疑 PIVOT 作为我的特定问题的答案的可行性时,我陷入了应该在 IN 语句中放入什么内容的困境。
GO
SELECT
strPatientFullName
,strStreetAddress
,strCity
,strState
,strZipcode
,strPrimaryPhoneNumber
,strSecondaryPhoneNumber
,blnSmoker
,decPackYears
,blnHeadOfHousehold
,dtmDateOfBirth
,strSex
,strAllergy
,strAllergyMedication
,strEmailAddress
,strRecordCreator
FROM ( SELECT * FROM VPatientPlusAllergyData ) PatientAllergyData
PIVOT
(
MAX(strAllergyMedication)
FOR strAllergy
IN ()
)
GO
Run Code Online (Sandbox Code Playgroud)
希望更熟悉 Pivot 的人能够向我展示我所缺少的内容或启发我找到更有效的解决方案。
谢谢您的帮助
****** 编辑:我已经决定,虽然我很想将这种操作放在服务器端,但对于我的特定应用程序,创建大量视图然后在客户端执行 SELECT 查询会更简单并以这种方式连接它们,然后实现“导出处理”屏幕。我感谢所有的帮助,也许有一天我会编写一个脚本并让它在服务器端执行,但目前这项工作已经足够好了 ******
下面是一个示例,说明如何使用 STUFF 语句、条件聚合和动态 SQL 执行此类操作。
DECLARE @SQL NVARCHAR(MAX) = '';
SELECT @SQL += '
, MAX(CASE WHEN RN = ' + RN + ' THEN strAllergy END) strAllergy' + RN + '
, MAX(CASE WHEN RN = ' + RN + ' THEN strAllergyMedications END) strAllergyMedications' + RN
FROM (
SELECT CAST(ROW_NUMBER() OVER (PARTITION BY strPatientFullName, strAllergy ORDER BY (SELECT NULL)) AS VARCHAR(5)) RN
FROM VPatientPlusAllergyData) T
GROUP BY RN;
SELECT @SQL = 'SELECT strPatientFullName' + @SQL + '
FROM (
SELECT strPatientFullname
, strAllergy
, STUFF((SELECT '', '' + strAllergyMedication FROM VPatientPlusAllergyData WHERE strPatientFullName = T.strPatientFullName AND strAllergy = T.strAllergy FOR XML PATH ('''')), 1, 2, '''') strAllergyMedications
, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM VPatientPlusAllergyData T
GROUP BY strPatientFullname, strAllergy) T
GROUP BY strPatientFullname;';
PRINT @SQL;
EXEC(@SQL);
Run Code Online (Sandbox Code Playgroud)
正如 scsimon 在评论中提到的,如果存在任意数量的过敏,动态 SQL 可能是必要的。stuff 语句是将逗号分隔值放入单个列的一种方法。条件聚合的工作方式与 PIVOT 通常的工作方式相同,但比普通的 PIVOT 语句更容易编写和理解 (IMO)。
| 归档时间: |
|
| 查看次数: |
5175 次 |
| 最近记录: |