gpt4 book ai didi

sql - 对非数值数据使用数据透视

转载 作者:行者123 更新时间:2023-12-01 17:46:45 26 4
gpt4 key购买 nike

这是我第一次尝试使用 PIVOT。我正在使用 Microsoft SQL Server。

所以这是我的问题,我一直在阅读 Pivot 并决定它将非常适合将患者数据导出到格式化文件(即报告)的项目,该文件可以打印出来等等......等等......

VPatientPlusAllergyData 是一个 View ,将其显示为示例结果,并删除了一些数据以便于阅读

strPatientFullName  strAllergy  strAllergyMedication
------------------------------------------------------------
Smith, John Henry Dogs Pounces
Smith, John Henry Dogs Orange Juice
Smith, John Henry Mustard Ketchup
Smith, John Henry Mustard Sugar

这就是我想要的结果

 strPatientFullName strAllergy1 strAllergy1Medications   strAllergy2    strAllergy2Medications
------------------------------------------------------------------------------------------------------
Smith, John Henry Dogs Pounces, OrangeJuice Mustard Ketchup, Sugar

在阅读 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

希望更熟悉 Pivot 的人能够向我展示我所缺少的内容或启发我找到更有效的解决方案。

感谢您的帮助

****** 编辑:我已经决定,虽然我希望将这种操作放在服务器端,但对于我的特定应用程序,创建大量 View 然后执行 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);

正如 scsimon 在评论中提到的,如果存在任意数量的过敏,动态 SQL 可能是必要的。 stuff 语句是将逗号分隔值放入单个列的一种方法。条件聚合的工作方式与 PIVOT 通常的工作方式相同,但比普通的 PIVOT 语句更容易编写和理解 (IMO)。

关于sql - 对非数值数据使用数据透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40537486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com