Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

सीमांकित डेटा के साथ एक कॉलम में टकराकर सीमांकित डेटा के साथ दो एसक्यूएल कॉलम का संयोजन

केवल सामान्य तालिका अभिव्यक्तियों का उपयोग करके, हम आवश्यक परिणाम भी प्राप्त कर सकते हैं, जैसा कि नीचे दिया गया है:-

सबसे पहले डेटा सेट करते हैं

declare @original table(
[value] varchar(250), 
[unit] varchar(250)
)
insert into @original values 
('4 ; 5','mg ; kg    '),
('50','mg        '                ),
('7.5 ; 325','kg ; mg    '        ),
('100 ; 1.5 ; 50 ','mg ; g ; mg'  )

अब, सामान्य टेबल एक्सप्रेशन बनाते हैं:-

;with cte as (
    select o.[value]+';' [value],o.[unit]+';' [unit],row_number() over (ORDER BY (Select 0)) [row]   from @original o
),cte2 as (
    select *
    ,1 [ValueStart],CHARINDEX(';',[value]) [ValueEnd]
    ,1 [UnitStart],CHARINDEX(';',[unit]) [UnitEnd]
     from cte
),cte3 as (
    select * from cte2
    union all 
    select [value],[unit],[row]
        ,[ValueEnd]+1 [ValueStart],CHARINDEX(';',[value],[ValueEnd]+1) [ValueEnd] 
        ,[UnitEnd]+1 [UnitStart],CHARINDEX(';',[unit],[UnitEnd]+1) [UnitEnd] 
    from cte3 where [UnitEnd]>0
),cte4 as (
    select *,row_number() over (partition by [row] order by [row]) [subRow]
    , rtrim(ltrim(substring([unit],[UnitStart],[UnitEnd]-[UnitStart])))  [subUnit] 
    , rtrim(ltrim(substring([value],[ValueStart],[ValueEnd]-[ValueStart])))  [subValue] 
    from cte3
    where [UnitEnd]>0
),cte5 as (
    select subRow,[row],[subValue],[subUnit],cast([subValue]+' '+[subUnit] as varchar(max)) [ValueUnit] from cte4 where subRow=1
    union all
    select cte4.subRow,cte4.[row],cte4.[subUnit],cte4.[subValue]
        ,cte5.[ValueUnit]+';'+ cte4.[subValue]+' '+cte4.[subUnit] [ValueUnit] 
            from cte4
        inner join cte5 on (cte5.subRow+1)=cte4.subRow and cte5.[row]=cte4.[row]
),cte6 as (
    select *,row_number() over (partition by [row] order by subRow desc) [selected] from cte5
)
select ValueUnit from cte6
where [selected]=1
order by [row] 

परिणाम इस प्रकार होंगे:-

ValueUnit
============
4 mg;5 kg 
50 mg  
7.5 kg;325 mg 
100 mg;1.5 g;50 mg


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका चर CTE में डालें

  2. मैं SQL सर्वर से 15+ मिलियन रिकॉर्ड कुशलतापूर्वक कैसे पढ़ सकता हूं, कुछ प्रसंस्करण कैसे कर सकता हूं, और उन्हें एक फ्लैट फ़ाइल में लिख सकता हूं?

  3. चयन/अद्यतन पर गतिरोध

  4. केवल गिनती होने का चयन करें=2

  5. IN SQL फ़ंक्शन में मान का उपयोग करके .NET से संग्रहीत कार्यविधि में अल्पविराम से अलग किए गए मान को पास करना