Sql 选择一个同名列标题并水平显示数据
我有两张桌子: 1-合同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
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