表A有两个字段姓名(可重复)和方案名称;表B有两个字段即姓名(唯一值);现在要在表B中增加一个字段方案内容,
现在要把表B的方案内容字段循环显示出所有表A的方案名称,关联条件是姓名;
输出结果为:
表A内容为
姓名 方案名称
张三 方案一
李四 方案三
张三 方案二
李四 方案四
最终输出结果表B内容为
姓名 方案内容
张三 方案一;
方案二;
李四 方案三;
方案四;
请问这个sql语句如何写,谢谢?
------解决方案--------------------
WITH test1(NAME ,idear )
AS (
SELECT N'张三',N'方案一' UNION ALL
SELECT N'张三',N'方案五' UNION ALL
SELECT N'李四',N'方案三' UNION ALL
SELECT N'张三',N'方案二' UNION ALL
SELECT N'李四',N'方案四' UNION ALL
SELECT N'赵六',N'方案一'
)
,test AS (
SELECT ROW_NUMBER() OVER(ORDER BY NAME) ID,* FROM test1
)
SELECT
CASE
WHEN EXISTS(SELECT 1 FROM test WHERE NAME=a.NAME AND ID<a.ID) THEN NULL
ELSE NAME
END NAME,idear
FROM test a
ORDER BY id
/****end
NAME idear
张三 方案五
NULL 方案二
NULL 方案一
李四 方案四
NULL 方案三
赵六 方案一
*/
------解决方案--------------------
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2014-06-05 15:35:29
-- Version:
-- Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86)
-- Feb 10 2012 19:13:17
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition: Core-based Licensing on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([姓名] varchar(4),[方案名称] varchar(6))
insert [tb]
select '张三','方案一' union all
select '李四','方案三' union all
select '张三','方案二' union all
select '李四','方案四'
--------------开始查询--------------------------
select
case when px=1 then 姓名 else '' end as 姓名,方案名称
from
(select px=row_number()over(partition by 姓名 order by getdate()),* from tb)t
----------------结果----------------------------
/* 姓名 方案名称
---- ------
李四 方案三
方案四
张三 方案一
方案二
(4 行受影响)
*/