将SQL数据合并为1行

时间:2019-09-18 19:06:52

标签: sql duplicates

我正在尝试构建代码来创建SSRS报告。文件夹类型ID 19表示会员ID。如果文件夹类型ID包含* 1300,则表示* 1300之前位于该字段中的提供者ID。我目前正在执行的操作的问题是它正在创建2行。填充提供者ID但成员ID显示为NULL的一种。另一个填充了会员ID,但提供者ID显示为NULL。我想要做的是将它们组合在一起,因此我只返回1行,并且正确填充了成员ID和提供者ID。最好的方法是什么?在此先感谢您的协助!

SELECT
xfl.xml_file_id                         
, dh.document_id                            
, dh.document_description                   
, dh.document_date                          
, CASE WHEN xfi.FOLDER_TYPE_ID = '19' THEN xfi.folder_id ELSE null END AS 
MemberID
, CASE WHEN RIGHT(xfi.folder_id, 5) = '*1300' THEN LEFT(xfi.folder_id, 
LEN(xfi.folder_id) - 5) ELSE null END AS ProviderID
, xfl.xml_file_name                         
, dp.document_file_path                     


FROM 
reporting.[FacetsRunout].[XML_FILE_LIST]            xfl 
JOIN reporting.[FacetsRunout].[Folder_ID]           xfi      
ON xfi.XML_FILE_ID = XFL.XML_FILE_ID
JOIN reporting.[FacetsRunout].[Document_Page]       dp       
ON dp.XML_FILE_ID = xfl.XML_FILE_ID
JOIN reporting.[FacetsRunout].[Document_Header]     dh       
ON 
   dh.XML_FILE_ID = xfl.XML_FILE_ID

WHERE
dh.DOCUMENT_ID = '07330C906700'

2 个答案:

答案 0 :(得分:0)

您可以按选择的所有列进行分组,并汇总到要合并为1行的列上:

SELECT
xfl.xml_file_id                         
, dh.document_id                            
, dh.document_description                   
, dh.document_date                          
, MAX(CASE WHEN xfi.FOLDER_TYPE_ID = '19' THEN xfi.folder_id END) AS MemberID
, MAX(CASE WHEN RIGHT(xfi.folder_id, 5) = '*1300' THEN LEFT(xfi.folder_id,LEN(xfi.folder_id) - 5) END) AS ProviderID
, xfl.xml_file_name                         
, dp.document_file_path                     
FROM 
reporting.[FacetsRunout].[XML_FILE_LIST]            xfl 
JOIN reporting.[FacetsRunout].[Folder_ID]           xfi      
ON xfi.XML_FILE_ID = XFL.XML_FILE_ID
JOIN reporting.[FacetsRunout].[Document_Page]       dp       
ON dp.XML_FILE_ID = xfl.XML_FILE_ID
JOIN reporting.[FacetsRunout].[Document_Header]     dh       
ON dh.XML_FILE_ID = xfl.XML_FILE_ID
WHERE dh.DOCUMENT_ID = '07330C906700'
GROUP BY 
xfl.xml_file_id                         
, dh.document_id                            
, dh.document_description                   
, dh.document_date                          
, xfl.xml_file_name                         
, dp.document_file_path

我也从两个CASE语句中删除了ELSE null,因为它是多余的。

答案 1 :(得分:0)

您可以在select子句中选择子查询中的两个属性:

SELECT
  dh.xml_file_id,
  dh.document_id,
  dh.document_description,
  dh.document_date,
  (
    SELECT xfi.folder_id
    FROM reporting.facetsrunout.folder_id xfi
    WHERE xfi.xml_file_id = dh.xml_file_id
    AND xfi.folder_type_id = '19'
  ) AS memberid,
  (
    SELECT LEFT(xfi.folder_id, LEN(xfi.folder_id) - 5)
    FROM reporting.facetsrunout.folder_id xfi
    WHERE xfi.xml_file_id = dh.xml_file_id
    AND RIGHT(xfi.folder_id, 5) = '*1300'
  ) AS providerid,
  xfl.xml_file_name
  dp.document_file_path
FROM reporting.facetsrunout.document_header dh
JOIN reporting.facetsrunout.document_page dp ON dp.xml_file_id = dh.xml_file_id
JOIN reporting.facetsrunout.xml_file_list xfl ON xfl.xml_file_id = dh.xml_file_id
WHERE dh.document_id = '07330C906700';