首页 > 解决方案 > 在sql server中将所有行转换为不同的行

问题描述

我有一个存储过程,它根据他们所属的子部门显示医生列表及其详细信息。下面是存储过程:

CREATE  PROCEDURE SP_BILL_FOOTER_DOCTOR      
@subDepartmentId int              
AS              
BEGIN              

SELECT  HETC_MST_EMPLOYEE.EMPLOYEE_NAME,              
    HETC_PAR_EMPLOYEE_TYPE.EMPLOYEE_TYPE_NAME,              
    HETC_MST_DOCTOR_SPECIALITY.DOCTOR_SPECIALITY_DESCRIPTION,              
    HETC_MST_SUB_DEPARTMENT.SUB_DEPARTMENT_NAME,    
    HETC_MST_EMPLOYEE.DOCTOR_SIGNATURE,    
    CASE WHEN HETC_MST_EMPLOYEE.DOCTOR_SIGNATURE = ''       
         THEN ''  
         ELSE ISNULL(SIGNATURE_PATH.DOCUMENT_PATH,'')+ HETC_MST_EMPLOYEE.DOCTOR_SIGNATURE      
     END AS DOCTOR_SIGNATURE_PIC      
FROM HETC_MST_EMPLOYEE              
INNER JOIN HETC_PAR_EMPLOYEE_TYPE              
  ON HETC_PAR_EMPLOYEE_TYPE.EMPLOYEE_TYPE_ID = HETC_MST_EMPLOYEE.EMPLOYEE_TYPE_ID              
INNER JOIN HETC_MST_DOCTOR_SPECIALITY              
  ON HETC_MST_DOCTOR_SPECIALITY.DOCTOR_SPECIALITY_ID = HETC_MST_EMPLOYEE.DOCTOR_SPECIALITY_ID              
INNER JOIN HETC_MST_DOCTOR_DEPARTMENT              
  ON HETC_MST_DOCTOR_DEPARTMENT.EMPLOYEE_ID = HETC_MST_EMPLOYEE.EMPLOYEE_ID              
INNER JOIN HETC_MST_SUB_DEPARTMENT              
  ON HETC_MST_SUB_DEPARTMENT.SUB_DEPARTMENT_ID = HETC_MST_DOCTOR_DEPARTMENT.SUB_DEPARTMENT_ID                
LEFT JOIN (SELECT DOCUMENT_PATH      
       FROM HETC_MST_DOCUMENT_PATH      
           INNER JOIN HETC_MST_TYPE_OF_ATTACHMENT      
             ON  HETC_MST_DOCUMENT_PATH.TYPE_OF_DOCUMENT_ID = HETC_MST_TYPE_OF_ATTACHMENT.TYPE_OF_DOCUMENT_ID      
       WHERE HETC_MST_TYPE_OF_ATTACHMENT.TYPE_OF_DOCUMENT_CODE='DSI') AS DOC_SIGNATURE_PIC  
ON 1=1               
WHERE  HETC_MST_SUB_DEPARTMENT.SUB_DEPARTMENT_ID = @subDepartmentId 
END

以下是程序执行时的输出链接:

程序的输出

我想知道是否可以转换不同列中的行。就像输出有 6 列和 2 行一样,我想要 1 行 12 列中的所有数据。以下是示例输出:

我想要的样本输出

如果有人可以指导我如何做到这一点,那将是非常有帮助的。我知道通过在 Sql 中使用 Pivot,我可以实现这一点,但我没有发现我的具体情况。

标签: sqlsql-server

解决方案


这并不是真正的答案,而是展示了使用别名可以在多大程度上提高查询的易读性。信不信由你,这与您发布的内容完全相同。我只是使用了别名,因此您可以阅读此内容,而不是查看一堵墙。唯一实际的变化是在 1 = 1 上使用交叉连接而不是左连接。

SELECT e.EMPLOYEE_NAME,              
    et.EMPLOYEE_TYPE_NAME,              
    s.DOCTOR_SPECIALITY_DESCRIPTION,              
    sd.SUB_DEPARTMENT_NAME,    
    e.DOCTOR_SIGNATURE,    
    CASE WHEN e.DOCTOR_SIGNATURE = ''       
        THEN ''  
        ELSE ISNULL(SIGNATURE_PATH.DOCUMENT_PATH, '') + e.DOCTOR_SIGNATURE      
    END AS DOCTOR_SIGNATURE_PIC      
FROM HETC_MST_EMPLOYEE e              
INNER JOIN HETC_PAR_EMPLOYEE_TYPE et ON et.EMPLOYEE_TYPE_ID = e.EMPLOYEE_TYPE_ID              
INNER JOIN HETC_MST_DOCTOR_SPECIALITY s ON s.DOCTOR_SPECIALITY_ID = e.DOCTOR_SPECIALITY_ID              
INNER JOIN HETC_MST_DOCTOR_DEPARTMENT dd ON dd.EMPLOYEE_ID = e.EMPLOYEE_ID              
INNER JOIN HETC_MST_SUB_DEPARTMENT sd ON sd.SUB_DEPARTMENT_ID = dd.SUB_DEPARTMENT_ID                
cross join
(
    SELECT DOCUMENT_PATH      
    FROM HETC_MST_DOCUMENT_PATH p     
    INNER JOIN HETC_MST_TYPE_OF_ATTACHMENT a ON  p.TYPE_OF_DOCUMENT_ID = a.TYPE_OF_DOCUMENT_ID      
       WHERE a.TYPE_OF_DOCUMENT_CODE='DSI'
) AS DOC_SIGNATURE_PIC  
WHERE sd.SUB_DEPARTMENT_ID = @subDepartmentId 

对于手头的问题,很难说出您在这里真正想要什么。也许一些条件聚合与 ROW_NUMBER 结合使用。或枢轴。您需要为此发布更多详细信息。这是一个很好的起点。http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/


推荐阅读