Sql 选择带有一个查询的多行(但请更改)
如何通过更改下面的查询来获得此结果Sql 选择带有一个查询的多行(但请更改),sql,sql-server,tsql,Sql,Sql Server,Tsql,如何通过更改下面的查询来获得此结果 foo 01 02 03 declare @a as int set @a = 1 select single.* from (select case when 0=0 then '0'+ case when @a = 1 then '1' when @a = 2 then '2' when @a = 3 then '3'
foo
01
02
03
declare @a as int
set @a = 1
select single.* from
(select
case
when 0=0 then '0'+
case
when @a = 1 then '1'
when @a = 2 then '2'
when @a = 3 then '3'
end
end
as foo) single
cross join
(select 1 as bir union all select 2 union all select 3) multi
如您所见,我需要在循环中(在每个“when”语句中)先写“1”,然后写a=a+1
PS:我有一个大的查询,我需要每行写三次,但有一些更改。(我需要在输出-最后一列-下将最后两行从“A0”更改为“**”)
您可以创建一个包含一列的表变量,并在其中插入1、2、3,然后将其外部连接到数据,然后使用case语句 比如:
DECLARE @onetwothree table (
num nvarchar(2)
)
INSERT into @onetwothree (num) VALUES ('01')
INSERT into @onetwothree (num) VALUES ('02')
INSERT into @onetwothree (num) VALUES ('03')
SELECT YourBigQuery.*, OneTwoThree.num
FROM YourBigQuery, @onetwothree AS OneTwoThree
SourceTable
--------|---------|---------|--------|
field1 | filed2 | filed3 | field4 |
--------|---------|---------|--------|
TR13 | BA20 | 2009-08 | A0 |
TR14 | BA21 | 2009-08 | A1 |
TR15 | BA22 | 2009-08 | A2 |
TR16 | BA23 | 2009-08 | A3 |
在案例陈述中:
DECLARE @onetwothree table (
num tinyint
)
INSERT into @onetwothree (num) VALUES (1)
INSERT into @onetwothree (num) VALUES (2)
INSERT into @onetwothree (num) VALUES (3)
SELECT YourBigQuery.*, (
CASE OneTwoThree.num
WHEN 1 THEN YourBigQuery.YourLastColumn
ELSE '**'
END
)
FROM YourBigQuery, @onetwothree AS OneTwoThree
老实说,我不知道这个问题的目的是什么。唯一显而易见的是,大部分都是徒劳的 但是,如果我正确理解了您的问题,那么表中有一个或多个记录,您希望根据这些记录生成一个结果集,该结果集包含每个记录的三个副本,但每个副本都有轻微的修改。因此,如果您有类似以下内容:
DECLARE @onetwothree table (
num nvarchar(2)
)
INSERT into @onetwothree (num) VALUES ('01')
INSERT into @onetwothree (num) VALUES ('02')
INSERT into @onetwothree (num) VALUES ('03')
SELECT YourBigQuery.*, OneTwoThree.num
FROM YourBigQuery, @onetwothree AS OneTwoThree
SourceTable
--------|---------|---------|--------|
field1 | filed2 | filed3 | field4 |
--------|---------|---------|--------|
TR13 | BA20 | 2009-08 | A0 |
TR14 | BA21 | 2009-08 | A1 |
TR15 | BA22 | 2009-08 | A2 |
TR16 | BA23 | 2009-08 | A3 |
你想得到这个:
TR13 | BA20 | 2009-08 | A0 |
TR13 | BA20 | 2009-08 | ** |
TR13 | BA20 | 2009-08 | ** |
TR14 | BA21 | 2009-08 | A1 |
TR14 | BA21 | 2009-08 | ** |
TR14 | BA21 | 2009-08 | ** |
TR15 | BA21 | 2009-08 | A2 |
TR15 | BA21 | 2009-08 | ** |
TR15 | BA21 | 2009-08 | ** |
TR16 | BA23 | 2009-08 | A3 |
TR16 | BA23 | 2009-08 | ** |
TR16 | BA23 | 2009-08 | ** |
然后您可以这样编写查询:
select SourceTable.field1
, SourceTable.field2
, SourceTable.field3
, case when multi.bir = 1 then SourceTable.field4 else '**' end
from SourceTable
cross join
(select 1 as bir union all select 2 union all select 3) multi
米基德的回答几乎相同
declare @a as int
set @a = 1
select
case
when multi.bir <> 1 then '**'
else single.foo
end
from
(select
case
when 0=0 then '0'+
case
when @a = 1 then '1'
when @a = 2 then '2'
when @a = 3 then '3'
end
end
as foo) single
cross join
(select 1 as bir union all select 2 union all select 3) multi
我不确定我是否正确地遵循了您的逻辑,请查看我的答案并让我知道我是否只需要3行。在我的输出中,我需要将last to rows的最后一列更改为“**”。您的查询是什么?我仍然不明白你想做什么,或者困难到底在哪里1.最重要的例子是我试图回答你最初的问题。第二部分(我刚刚补充)更符合您的实际需要。