SQL表列数据转成行数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL表列数据转成行数据相关的知识,希望对你有一定的参考价值。
A表数据内容以下:
B6BA 996000010003 600.00 New DATA 0
B6BA 996000010003 1.00 770 0
B6BA 996000010070 -900.00 ADD 1
B6BA 996000010070 999.00 O 1
B6BA 996000010070 -7290.00 AAAA 1
。。。。。。等等
以上数据(举例),显示成以下格式:
B6BA 996000010003 600.00 New DATA 996000010070 -900.00 ADD
B6BA 996000010003 1.00 770 996000010070 999.00 O
B6BA NULL NULL NULL 996000010070 -7290.00 AAAA
如满意再加50分。
A表数据内容以下:
B6BA 996000010003 600.00 New DATA 0
B6BA 996000010070 999.00 O 1
B6BA 996000010070 -7290.00 AAAA 1
以上数据(举例),显示成以下格式:
B6BA 996000010003 600.00 NewDATA 996000010070 999.00 O
B6BA NULL NULL NULL 996000010070 -7290.00 AAAA
CardNo varchar(30),SumMoney money,Type varchar(30)) --临时表
create table #A07(AId varchar(30),
CardNo varchar(30),SumMoney money,Type varchar(30))
insert into #A03 select AId,CardNo,SumMoney,Type from A
where AID='B6BA' and CardNo='996000010003'
insert into #A70 select AId,CardNo,SumMoney,Type from A
where AID='B6BA' and CardNo='996000010070'
select a.AID,a.CardNo,a.SumMoney,a.Type,
b.CardNo,b.SumMoney,b.Type
from #A03 a right join #A70 b on a.CardNo='996000010003' and b.CardNo='996000010070'
--你试试追问
左连接、右连接、全连接都已经试过了,数据会重复,没值得会天空,但是不能满足要求。
追答你再试试这个cursor游标这个思路
create table #temp(AId varchar(30),
CardNo1 varchar(30),SumMoney1 money,Type1 varchar(30),
CardNo2 varchar(30),SumMoney2 money,Type2 varchar(30))
declare @row int ,@x int
set @x=1
select @row=count(*) from #A70
declare @AId varchar(30),
@CardNo1 varchar(30),@SumMoney1 money,@Type1 varchar(30),
@CardNo2 varchar(30),@SumMoney2 money,@Type2 varchar(30)
while @x<=@row
begin
set @AId =null
set @CardNo1=null
set @SumMoney1 =null
set @Type1 =null
set @CardNo2 =null
set @SumMoney2 =null
set @Type2 =null
select top 1 @AId=AID, @CardNo1=CardNo, @SumMoney1=SumMoney, @Type1=Type from #A03
select top 1 @CardNo2=CardNo, @SumMoney2=SumMoney, @Type2=Type from #A70
set rowcount 1
delete from #A03 where CardNo='996000010003'
set rowcount 1
delete from #A70 where CardNo='996000010070'
insert into #temp values (@AId,@CardNo1,@SumMoney1,@Type1,@CardNo2,@SumMoney2,@Type2)
set @x=@x+1
end
--恢复受影响的行数
select * from #temp
--这个笨方法试试
max(case t.lx when 'AA' then t.ct else 0 end) AA,
max(case t.lx when 'BB' then t.ct else 0 end) BB
from biao t
group by t.xx
行列转换 你可以百度找找这个追问
你这样的回到不如不答!浪费自己的时间也浪费他人的时间。
参考技术C SQL server ,这种高难度的问题,建议到专业的技术论坛,例如msdn或者博客园,提问,这里一般情况下得不到正确答案!在 SQL Server 中,如何从子查询中标识的表列名称中检索数据值?
【中文标题】在 SQL Server 中,如何从子查询中标识的表列名称中检索数据值?【英文标题】:In SQL Server, how do I retrieve data values from table column names identified in a sub-query? 【发布时间】:2016-06-27 00:24:30 【问题描述】:我正在使用以下 SQL 列出我的架构中的所有表和列名,这些表包含名称包含字符串“code”的表,使用以下 SQL 服务器查询:
SELECT
a.table_name, a.column_name from (SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM
sys.tables AS t
INNER JOIN
sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE
c.name LIKE '%code%') a
结果:
Table Name Column Name
---------- -----------
Tab_1_name a_code
Tab_2_name another_code
Tab_3_name yet_another_code
and so on...
我现在想使用包装器查询 a_code 和 another_code 列中的实际数据,但看不到如何获取实际数据(例如,如果单独为 Tab 1 做,我会
SELECT a_code FROM Tab_1
得到
a_code
------
value 1
value 2
value 3
但无法弄清楚或在任何地方找到如何编码外部查询以环绕上述内容,以便我得到以下内容:
Tab1_name a_code
--------- ------
tab_name 1 value 1
tab_name 1 value 2
tab_name 2 value 1
tab_name 2 value 2
tab_name 3 value 1
tab_name 3 value 2 ... etc.
即我的模式/数据库中所有表列中所有数据值的格式化列表,其名称包含“代码”一词?
【问题讨论】:
这不能通过任何查询嵌套来完成。这取决于动态 sql。 好的,想知道是否可能是这种情况。对此非常陌生。应该在问题中提到它。将离开并调查。谢谢伊万。 【参考方案1】:没有动态SQL,无论如何都做不到。
这里有一些东西可以帮助您入门。
DECLARE @SearchTerm NVARCHAR(50)
SELECT @SearchTerm = '%id%'
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
INTO #temp
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE @SearchTerm
ORDER BY t.name
DECLARE @Query NVARCHAR(MAX),
@tableName NVARCHAR(250),
@schemaName NVARCHAR(10),
@columnName NVARCHAR(250)
SELECT @Query = 'SELECT SchemaName = '''',
TableName = '''',
ColumnName = '''',
Value = CONVERT(NVARCHAR(MAX), '''')
WHERE 0 = 1'
WHILE(EXISTS(SELECT TOP 1 1 FROM #temp))
BEGIN
SELECT TOP 1 @tableName = table_name,
@schemaName = [schema_name],
@columnName = column_name
FROM #temp
SELECT @Query = @Query + ' UNION ALL SELECT SchemaName = ''' + @schemaName + ''',
TableName = ''' + @tableName + ''',
ColumnName = ''' + @columnName + ''',
Value = CASE WHEN ' + @columnName + ' IS NULL THEN ''NULL'' ELSE CONVERT(NVARCHAR(MAX), ' + @columnName + ') END
FROM ' + @tableName
DELETE #temp
WHERE table_name = @tableName
AND @schemaName = [schema_name]
AND @columnName = column_name
END
PRINT @Query
EXEC sp_executesql @Query
DROP TABLE #temp
上述查询返回以下信息: SchemaName TableName ColumnName 值
请注意,通过返回所有匹配列的值,您很可能会遇到转换问题和空转换问题。在上面的查询中,处理了基本大小写,但转换为“NVARCHAR”可能仍会因某些复杂的 SQL 列类型而失败。
【讨论】:
好的,试一试。谢谢。【参考方案2】:use master
GO
declare
@sql varchar(max) = '',
@colpattern varchar(100) = '%name%'
;with cteSchema as
(
select
object_schema_name(t.object_id) + '.' + quotename(t.name) as tabname,
quotename(c.name) as colname
from sys.tables t
inner join sys.columns c on c.object_id = t.object_id
where c.name like @colpattern
)
select @sql =
(
select
cast('
select cast(t.' as varchar(max)) + t.colname + ' as varchar(1000)) as [value] '
+ ', cast(''' + t.tabname + '.' + t.colname + ''' as nvarchar(2000)) as [source] '
+ ' from ' + t.tabname + ' t
union all '
from cteSchema t
order by t.tabname, t.colname
for xml path(''), type
).value('.', 'varchar(max)')
+ '
select null, null where 1=0
order by [source], [value]'
print @sql
exec (@sql)
GO
【讨论】:
谢谢伊万。一旦我在 sys.tables 前面加上数据库名称,我就会得到“1 行受影响”,最后在大约第 20 次迭代时出现运行/语法错误。 为什么要以数据库为前缀?删除/修改use
命令。以上是关于SQL表列数据转成行数据的主要内容,如果未能解决你的问题,请参考以下文章