Rac*_*SQL 6 sql-server-2008 sql-server
我有一张这样的表:
TB1:
COD | A001 | A002 | A003
1 cars baby nasa
Run Code Online (Sandbox Code Playgroud)
然后是第二张桌子:
TB2:
COD | NO_COL_TB1 | DESCRIPTION |
1 | A001 | Something
2 | A002 | lasagna
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的是这样的事情(显然这不起作用)
select A001 as (select description from TB2 WHERE no_col_tb1= A001 )
,A002 AS (select description from TB2 WHERE no_col_tb1= A002 )
from TB1
Run Code Online (Sandbox Code Playgroud)
我尝试使用内部连接和一些动态 sql,但我无法思考这个逻辑。有一些关于此的问题,但没有一个可以帮助我。我认为这是不可能用单个语句完成的,只能用动态 SQL 来完成。
编辑:
正确的结果是:
SELECT COD,
TB1.A001 AS 'Something',
TB1.A002 AS 'Lasagna'
FROM TB1
Run Code Online (Sandbox Code Playgroud)
结果将是:
COD |SOMETHING | LASAGNA |
1 cars baby
Run Code Online (Sandbox Code Playgroud)
Tar*_*ryn 25
很抱歉,但考虑到您想要做什么,您的表结构很难处理。有多种方法可以获得结果,一种方法是使用UNPIVOT
and PIVOT
,但它很难看。
您可以首先UNPIVOT
将数据TB1
从列输入到行:
select *
from tb1 t1
unpivot
(
val
for col in (A001, A002, A003)
) u
Run Code Online (Sandbox Code Playgroud)
这将以以下格式返回数据:
| COD | val | col |
|-----|------|------|
| 1 | cars | A001 |
| 1 | baby | A002 |
| 1 | nasa | A003 |
Run Code Online (Sandbox Code Playgroud)
然后您可以获取该结果并将其加入TB2
:
select
d.COD,
d.val,
t2.DESCRIPTION
from
(
select *
from tb1 t1
unpivot
(
val
for col in (A001, A002, A003)
) u
)d
inner join tb2 t2
on d.col = t2.NO_COL_TB1;
Run Code Online (Sandbox Code Playgroud)
这给出了结果:
| COD | val | DESCRIPTION |
|-----|------|-------------|
| 1 | cars | Something |
| 1 | baby | lasagna |
Run Code Online (Sandbox Code Playgroud)
现在您在行Description
和val
行中有新的列名,但您希望它们在列中,所以现在您可以将PIVOT
函数应用于它:
select *
from
(
select
d.COD,
d.val,
t2.DESCRIPTION
from
(
select *
from tb1 t1
unpivot
(
val
for col in (A001, A002, A003)
) u
)d
inner join tb2 t2
on d.col = t2.NO_COL_TB1
) x
pivot
(
max(val)
for description in (Something, Lasagna)
) p;
Run Code Online (Sandbox Code Playgroud)
这将生成您想要的最终结果:
| COD | Something | Lasagna |
|-----|-----------|---------|
| 1 | cars | baby |
Run Code Online (Sandbox Code Playgroud)
现在,所有这是伟大的,如果你知道你需要的所有列UNPIVOT
,然后PIVOT
,但如果你不这样做,那么你就需要使用动态SQL来解决它。看起来像这样:
DECLARE
@colsUnpivot AS NVARCHAR(MAX),
@colsPivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsUnpivot
= stuff((select ','+quotename(C.column_name)
from information_schema.columns as C
where C.table_name = 'tb1' and
C.column_name like 'A%'
for xml path('')), 1, 1, '')
select @colsPivot
= stuff((select ','+quotename([DESCRIPTION])
from Tb2
for xml path('')), 1, 1, '')
set @query = 'select *
from
(
select
d.COD,
d.val,
t2.DESCRIPTION
from
(
select *
from tb1 t1
unpivot
(
val
for col in ('+ @colsUnpivot +')
) u
)d
inner join tb2 t2
on d.col = t2.NO_COL_TB1
) x
pivot
(
max(val)
for description in ('+@colsPivot+')
) p;';
exec sp_executesql @query;
Run Code Online (Sandbox Code Playgroud)
它很长,但它应该给你相同的结果。( dbfiddle 演示)
归档时间: |
|
查看次数: |
3725 次 |
最近记录: |