Sql 选择一个同名列标题并水平显示数据

Sql 选择一个同名列标题并水平显示数据,sql,sql-server,Sql,Sql Server,我有两张桌子: 1-合同 contracts_id | subject_contract 001 | name 002 | name 2-U文件 contracts_id | file_data 001 | 1image <varbinary(MAX)> 002

我有两张桌子:

1-合同

    contracts_id  |  subject_contract  
    001           |  name              
    002           |  name                         
2-U文件

    contracts_id  |  file_data
    001           |  1image <varbinary(MAX)>
    002           |  1image <varbinary(MAX)>
    001           |  2image <varbinary(MAX)>
    002           |  2image <varbinary(MAX)>
我试试这个

SELECT Contracts.[contracts_id]  
      ,Contracts.[subject_contract]
      ,contracts_files.[filedata]


  FROM Contracts , contracts_files

  where contracts_files.contracts_id = Contracts.contracts_id

  AND Contracts.contracts_id=' 001 '
但结果是:

contracts_id  |  subject_contract  |  file_data  
    001       |  name              |  1image  
    001       |  name              |  2image    

那么,我如何使用“FOR LOOP”或“CASE”创建它呢?

您可以使用pivot,如下所示:

Select * from (
    SELECT c.[contracts_id]  
          ,c.[subject_contract]
          ,cf.[filedata]
          ,RN = Row_Number() over (partition by c.[Contracts_id] order by c.[contracts_id])
      FROM Contracts c join contracts_files cf
      ON cf.contracts_id = c.contracts_id
      ) a
      pivot (max(filedata) for RN in ([1],[2]) ) p

如果您不喜欢pivot,请使用旧的case方法(当某个变量=1)然后(某个值)。如果when不起作用,则使用null,MAX()将不会返回null。突出显示内部查询并运行该查询,以查看数据在转换过程中的外观

SELECT
  contracts_id,
  subject_contract,
  MAX(CASE WHEN rown = 1 then file_data end) as file1,
  MAX(CASE WHEN rown = 2 then file_data end) as file2

FROM 
  (SELECT c.contracts_id, subject_contract, file_data, row_number() over (partition by c.[Contracts_id] order by c.[contracts_id]) as rown FROM contracts c INNER JOIN contracts_files cf ON cf.contracts_id = c.contracts_id) a
GROUP BY
  contracts_id, 
  subject_contract

感谢您的回复:但是,'pivot(max(filedata)for RN in([1],[2])p'中出现了一些错误,我想它应该是别名。。。我更新了,你现在能检查一下吗,有什么错误吗?那么,你要求使用案例的解决方案,然后接受一个不使用它的答案?
SELECT
  contracts_id,
  subject_contract,
  MAX(CASE WHEN rown = 1 then file_data end) as file1,
  MAX(CASE WHEN rown = 2 then file_data end) as file2

FROM 
  (SELECT c.contracts_id, subject_contract, file_data, row_number() over (partition by c.[Contracts_id] order by c.[contracts_id]) as rown FROM contracts c INNER JOIN contracts_files cf ON cf.contracts_id = c.contracts_id) a
GROUP BY
  contracts_id, 
  subject_contract