Sql server 如何从两个具有特殊字段布局的sql表中选择数据

Sql server 如何从两个具有特殊字段布局的sql表中选择数据,sql-server,Sql Server,我有两个表,如示例所示。现在,我想选择以下注释行中显示的格式的数据 create table cust (nbr varchar(8)) create table data (nbr varchar(8),fld varchar(8),val varchar(8)) insert into cust (nbr) values ('AA') insert into data (nbr,fld,val) values ('AA','1','one') insert into data (nbr,f

我有两个表,如示例所示。现在,我想选择以下注释行中显示的格式的数据

create table cust (nbr varchar(8))
create table data (nbr varchar(8),fld varchar(8),val varchar(8))

insert into cust (nbr) values ('AA')
insert into data (nbr,fld,val) values ('AA','1','one')
insert into data (nbr,fld,val) values ('AA','2','two')
insert into data (nbr,fld,val) values ('AA','3','three')
insert into data (nbr,fld,val) values ('AA','1','uno')
insert into data (nbr,fld,val) values ('AA','2','dos')
insert into data (nbr,fld,val) values ('AA','3','tres')

select * from cust
select * from data

drop table cust
drop table data

-- AA, One, Two, Three
-- AA, Uno, Dos, Tres

任何关于如何连接这些表以获得所需输出的想法。

目前,您的数据表中没有任何允许您将行分组到您可以使用的任何内容中的内容。如果您按照@avery_larry的建议将languageID列添加到数据表中,您可以按如下方式编写选择:

create table cust (nbr varchar(8))
create table data (nbr varchar(8),fld varchar(8),val varchar(8), languageID int)

insert into cust (nbr) values ('AA')
insert into data (nbr,fld,val, languageID) values ('AA','1','one', 1)
insert into data (nbr,fld,val, languageID) values ('AA','2','two', 1)
insert into data (nbr,fld,val, languageID) values ('AA','3','three', 1)
insert into data (nbr,fld,val, languageID) values ('AA','1','uno', 2)
insert into data (nbr,fld,val, languageID) values ('AA','2','dos', 2)
insert into data (nbr,fld,val, languageID) values ('AA','3','tres', 2);

select * from cust;
select * from data;


with data_cte(nbr, languageID)
as
(
    select nbr, languageID
    from data with (nolock)
    group by nbr, languageID
)
select c.nbr,
    SUBSTRING(
        (
            SELECT ','+d.val AS [text()]
            FROM [data] d
            WHERE d.nbr = dc.nbr and d.languageID = dc.languageID
            ORDER BY d.fld
            FOR XML PATH ('')
        ), 2, 1000) as 'Values'
from data_cte dc
inner join cust c on c.nbr = dc.nbr;

drop table cust
drop table data
连接字符串的sql取自本文,添加了一点tweek


希望这能有所帮助。

'One'
'Two'
为什么不
'One'
'Dos'
?(请记住,SQL server不懂公共语言,所以这三个值都是3个字符的
varchar
值。)如果客户有第四行呢?我看不到任何简单的方法。您必须手动指定val允许的匹配项。但我认为您可以添加另一个具有LanguageID和AllowedWords的“language”表。然后可以使用该表进行连接,然后通过pivot获得所需的输出。学习一些数据库设计将是一个良好的开端。