2015-04-17 6 views
7

Mam tabelę, która może mieć maksymalnie 5 wierszy i co najmniej 1 wiersz. Teraz muszę przechowywać te wiersze w różnych zmiennych, takich jak @v1,@v2,@v3,@v4,@v5. Jak mogę to zrobić?Jak przechowywać wartości wiersza stałego w zmiennej - serwer SQL

Tabela ma tylko 1 kolumnę custid.

CustId 
100 
200 
300 
400 

Jeżeli tabela zawiera tylko 1 wiersz następnie @v1 powinny mieć tę wartość, a reszta może być null.

+0

To [LINK] (http : //www.sqlmatters.com/Articles/Converting%20row%20values%20in%20a%20table%20to%20a%20single%20concatenated%20string.aspx) może pomóc. :) –

Odpowiedz

9

można użyć następującego zapytania:

SELECT @v1 = MAX(CASE WHEN rn = 1 THEN CustId END), 
     @v2 = MAX(CASE WHEN rn = 2 THEN CustId END), 
     @v3 = MAX(CASE WHEN rn = 3 THEN CustId END), 
     @v4 = MAX(CASE WHEN rn = 4 THEN CustId END), 
     @v5 = MAX(CASE WHEN rn = 5 THEN CustId END) 
FROM (
    SELECT CustId, ROW_NUMBER() OVER (ORDER BY CustId) AS rn 
    FROM mytable) t 

Korzystanie ROW_NUMBER przypisać odrębny numer do każdego rekordu w tabeli. Następnie, korzystając z agregatów warunkowych w zapytaniu zewnętrznym, możesz użyć tej liczby, aby ustawić każdą oddzielną zmienną.

Jeśli jest mniej niż 5 wierszy, odpowiednie zmienne zostaną ustawione na NULL.

SQL Fiddle Demo

1

Spróbuj ..

create table #tab 
(
    custID int 
) 

insert into #tab 
select 110 union all 
select 120 union all 
select 130 union all 
select 140 union all 
select 150 

declare @v1 int,@v2 int, @v3 int, @v4 int, @v5 int 

select @v1 = custID 
from #tab 
order by custid 
OFFSET 0 row 
FETCH NEXT 1 ROW ONLY 

select @v2 = custID 
from #tab 
order by custid 
OFFSET 1 row 
FETCH NEXT 1 ROW ONLY 

select @v3 = custID 
from #tab 
order by custid 
OFFSET 2 row 
FETCH NEXT 1 ROW ONLY 

select @v4 = custID 
from #tab 
order by custid 
OFFSET 3 row 
FETCH NEXT 1 ROW ONLY 


select @v5 = custID 
from #tab 
order by custid 
OFFSET 4 row 
FETCH NEXT 1 ROW ONLY 
select @v1,@v2,@v3,@v4,@v5 
5

Jeśli masz SQL Server 2012 lub nowszy, można spróbować LAG() funkcję.

SELECT 
    @v1 = custID 
    , @v2 = LAG(custID, 1) OVER (ORDER BY custID DESC) 
    , @v3 = LAG(custID, 2) OVER (ORDER BY custID DESC) 
    , @v4 = LAG(custID, 3) OVER (ORDER BY custID DESC) 
    , @v5 = LAG(custID, 4) OVER (ORDER BY custID DESC) 
FROM yourTable 
ORDER BY CustID DESC 

SQLFiddle Demo

0

Tylko dla zabawy, jeden brutalne podejście:

Select @v1 = t1.CustID, 
     @v2 = oa2.CustID, 
     @v3 = oa3.CustID, 
     @v4 = oa4.CustID, 
     @v5 = oa5.CustID 
from Table t1 
outer apply(select top 1 CustID from Table t2 where t2.CustID not in(t1.CustID) order by CustID) oa2 
outer apply(select top 1 CustID from Table t3 where t3.CustID not in(t1.CustID, oa2.CustID) Order by CustID) oa3 
outer apply(select top 1 CustID from Table t4 where t4.CustID not in(t1.CustID, oa2.CustID, oa3.CustID) Order by CustID) oa4 
outer apply(select top 1 CustID from Table t5 where t5.CustID not in(t1.CustID, oa2.CustID, oa3.CustID, oa4.CustID) Order by CustID) oa5 
1

możemy to osiągnąć nawet przy użyciu PIVOT funkcję iz pomocą row_number

declare @mytable table (CustId int) 
insert into @mytable values 
(100), (200), (300), (400),(500) 


SELECT [1] as V1, [2]as V2, [3]as V3, [4]as V4, [5]as V5 
FROM 
(SELECT CustId,ROW_NUMBER() OVER (ORDER BY CustId) AS value 
    FROM @mytable) AS SourceTable 
PIVOT 
(
max(CustId) 
FOR value IN ([1], [2], [3], [4],[5]) 
) AS PivotTable 
Powiązane problemy