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

SQL में किसी दिए गए स्ट्रिंग में अक्षर को शून्य में बदलना

ऐसा करने के लिए संयुक्त रूप से कई उन्नत तकनीकों की आवश्यकता होती है। पहली समस्या यह है कि आपके पास सीमित डेटा है। यह 1NF का उल्लंघन करता है जब आप एक ही सेल में कई मानों को रटते हैं। पहेली का दूसरा भाग यह है कि इस डेटा को स्तंभों की एक गतिशील संख्या में कैसे पिवोट किया जाए। SO के आसपास के अधिकांश लोग गतिशील PIVOT का उपयोग करना पसंद करते हैं। मैं इसके बजाय एक गतिशील क्रॉस टैब का उपयोग करना पसंद करता हूं। मुझे सिंटैक्स कम उलझा हुआ लगता है और यह डायनेमिक क्रॉस टैब की तुलना में थोड़ा अधिक प्रदर्शन करने वाला है।

आप उस फाड़नेवाला के बारे में पढ़ सकते हैं जिसका मैं आमतौर पर यहाँ उपयोग करता हूँ। http://www.sqlservercentral.com/articles/Tally+Table/72993/ इस स्प्लिटर का मुख्य लाभ यह है कि अधिकांश अन्य नहीं करते हैं कि यह मूल्यों की सूची के भीतर आइटम की पंक्ति संख्या देता है। यह इस प्रकार की स्थिति के लिए अविश्वसनीय रूप से उपयोगी है। यदि आप वास्तव में फाड़नेवाला दुनिया में गोता लगाना चाहते हैं तो यहां कई अन्य उत्कृष्ट विकल्प हैं। http://sqlperformance.com/2012/07/t-sql -क्वेरी/स्प्लिट-स्ट्रिंग्स

आप यहां डायनेमिक क्रॉस टैब के बारे में अधिक पढ़ सकते हैं। http://www.sqlservercentral.com/articles/Crosstab/65048/

मैं वास्तव में यह नहीं समझता कि #STATICFILTER तालिका का इससे क्या लेना-देना है इसलिए मैंने इसे अनदेखा कर दिया।

सुनिश्चित करें कि आप इसे लागू करने से पहले इस कोड को समझते हैं। संदर्भित लेख इन तकनीकों के बारे में बहुत विस्तार से बताते हैं।

if OBJECT_ID('tempdb..#MathTemp1') is not null
    drop table #MathTemp1

CREATE TABLE #MathTemp1
(
    IDNUM INTEGER IDENTITY(1,1),
    YEARMONTH VARCHAR(256),
    OutputFormula VARCHAR(256),
    Timedimensiondate Date
)

INSERT INTO #MathTemp1 (YEARMONTH,OUTPUTFORMULA,Timedimensiondate)
VALUES ('CV(N2)  1989: 1','2641.000 + Import - Consumption customs value(1540) + Import - Consumption customs value(1541)','1989-01-01')
,('CV(N2)  1989: 10','54407.000 + Import - Consumption customs value(1540) + 63906.000','1989-10-01')
,('CV(N2)  1990: 11','Import - Consumption customs value(2266) + Import - Consumption customs value(1540) + 53088.000','1990-11-01')
,('CV(N2)  1994: 5','32852.000 + Import - Consumption customs value(1540) + Import - Consumption customs value(1541)','1994-05-01')

declare @StaticPortion nvarchar(2000) = 
    'with OrderedResults as
    (   
        select mt.IDNUM
            , mt.OutputFormula
            , mt.Timedimensiondate
            , mt.YEARMONTH
            , x.ItemNumber
            , LTRIM(RTRIM(x.Item)) as Item
        from #MathTemp1 mt
        cross apply dbo.DelimitedSplit8K(mt.OutputFormula, ''+'') x
    )
    Select IDNUM';

declare @DynamicPortion nvarchar(max) = '';
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by IDNUM order by IDNUM';  

with E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS 
(
    SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)

select @DynamicPortion = @DynamicPortion + 
    ', MAX(Case when ItemNumber = ' + CAST(N as varchar(6)) + 'then case when ISNUMERIC(Item) = 1 then convert(numeric(9,3), ltrim(rtrim(Item))) else 0 end end) as Value' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <= 
(
    select MAX(LEN(OutputFormula) - LEN(replace(OutputFormula, '+', ''))) + 1
    from #MathTemp1
)


declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;

--select @SqlToExecute
exec sp_executesql @SqlToExecute



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक कथन में अनेक बाधाएँ जोड़ें

  2. फ्लैट फ़ाइल से SQL सर्वर में लाखों रिकॉर्ड डालने के क्या नुकसान हैं?

  3. SQL सर्वर (लोकलडीबी)\v11.0 समझाया गया

  4. SQL सर्वर 2005 में 'उपयोगकर्ता बनाएँ' के लिए अनुमतियाँ आवश्यक हैं?

  5. टी-एसक्यूएल का उपयोग करके "सर्वर आरपीसी के लिए कॉन्फ़िगर नहीं किया गया है" संदेश 7411 को कैसे ठीक करें?