2017-12-07 70 views
5
Country Percentage 

India  12% 
USA  20% 
Australia 15% 
Qatar  10% 

आउटपुट:एसक्यूएल टेबल को आधा में कैसे विभाजित करें और पंक्तियों के दूसरे आधे को SQL क्वेरी के साथ नए कॉलम पर भेजें?

Country1 Percentage1  Country2  Percentage2 
India  12%    Australia 15% 
USA   20%    Qatar  10% 

उदाहरण के लिए वहाँ एक मेज देश जो प्रतिशत है, मैं आधा में तालिका विभाजित और नए कॉलम में शेष आधा (अर्थात शेष पंक्तियों) दिखाने की जरूरत है। मैंने पाठ में तालिका संरचना भी प्रदान की है।

+4

सबसे यहाँ के लोग, स्वरूपित पाठ चाहते हैं नहीं छवियों है। – jarlh

+4

हम कैसे जानते हैं कि प्रत्येक देश के लिए कौन सा कॉलम उपयोग करना है? – jarlh

+1

jarlh - क्या प्रश्न छवि के माध्यम से स्पष्ट नहीं है? जिस क्रम में देश मौजूद हैं, उस क्रम में हमें केवल विभाजित करने की आवश्यकता है। उदा। - भारत और यूएसए पहले और दूसरे देश हैं और निम्नलिखित देशों को अन्य कॉलमों में पालन करना चाहिए। –

उत्तर

3

इस

declare @t table 
(
Country VARCHAR(20), 
percentage INT 
) 
declare @cnt int 

INSERT INTO @T 
VALUES('India',12),('USA',20),('Australia',15),('Quatar',12) 

select @cnt = count(1)+1 from @t 

;with cte 
as 
(
    select 
    SeqNo = row_number() over(order by Country), 
    Country, 
    percentage 
    from @t 
) 
select 
* 
from cte c1 
left join cte c2 
on c1.seqno = ([email protected]/2) 
and c2.SeqNo >= (@cnt/2) 
where c1.SeqNo <= (@cnt/2) 
+1

पंक्तियों की गिनती अजीब है तो यह काम नहीं करता है। – Leran2002

+0

मैंने कुछ मामूली कोड परिवर्तन किए हैं, अब जांचें –

+0

ठीक है। अब यह काम कर रहा है! – Leran2002

2

मेरे संस्करण

SELECT 'A' Country,1 Percentage INTO #Country 
UNION ALL SELECT 'B' Country,2 Percentage 
UNION ALL SELECT 'C' Country,3 Percentage 
UNION ALL SELECT 'D' Country,4 Percentage 
UNION ALL SELECT 'E' Country,5 Percentage 

;WITH numCTE AS(
    SELECT 
    *, 
    ROW_NUMBER()OVER(ORDER BY Country) RowNum, 
    COUNT(*)OVER() CountOfCountry 
    FROM #Country 
), 
set1CTE AS(
    SELECT Country,Percentage,ROW_NUMBER()OVER(ORDER BY Country) RowNum 
    FROM numCTE 
    WHERE RowNum<=CEILING(CountOfCountry/2.) 
), 
set2CTE AS(
    SELECT Country,Percentage,ROW_NUMBER()OVER(ORDER BY Country) RowNum 
    FROM numCTE 
    WHERE RowNum>CEILING(CountOfCountry/2.) 
) 
SELECT 
    s1.Country,s1.Percentage, 
    s2.Country,s2.Percentage 
FROM set1CTE s1 
LEFT JOIN set2CTE s2 ON s1.RowNum=s2.RowNum 

DROP TABLE #Country 
5

सबसे पहले कोशिश करें, आपरेशन के इस प्रकार डेटाबेस में अनुप्रयोग परत में किया जाना चाहिए और नहीं। उस ने कहा, डेटाबेस में यह कैसे करना है यह देखने के लिए यह एक दिलचस्प अभ्यास हो सकता है।

मैं सशर्त एकत्रीकरण या pivot का उपयोग करूंगा। ध्यान दें कि एसक्यूएल टेबल स्वाभाविक रूप से अनियंत्रित हैं। आपकी बेस टेबल में कोई स्पष्ट ऑर्डरिंग नहीं है, इसलिए मूल्य किसी भी क्रम में आ सकता है।

select max(case when seqnum % 2 = 0 then country end) as country_1, 
     max(case when seqnum % 2 = 0 then percentage end) as percentage_1, 
     max(case when seqnum % 2 = 1 then country end) as country_2, 
     max(case when seqnum % 2 = 1 then percentage end) as percentage_2  
from (select c.*, 
      (row_number() over (order by (select null)) - 1) as seqnum 
     from country c 
    ) c 
group by seqnum/2; 
+0

समाधान के लिए धन्यवाद के लिए आदेश दें। लेकिन इसके साथ एकमात्र समस्या यह है कि अनुक्रम बदल रहा है .. यानी: 'यूएसए' तीसरे कॉलम में आ रहा है- 'देश 1', दूसरी पंक्ति में आने के बजाय 'काउंटी 2'। आशा है कि आपको क्या मिल रहा है। अन्यथा समाधान रॉक ठोस है। कृपया देखें कि क्या आप इसके लिए समाधान प्रदान कर सकते हैं। एक बार फिर धन्यवाद। –

+0

@ नयन_07। । । आपको ऑर्डरिंग निर्दिष्ट करने का एक तरीका चाहिए। वह जाता है जहां '(नल का चयन करें) 'जाता है। मुझे आपकी पंक्तियों को ऑर्डर करने का कोई स्वाभाविक तरीका नहीं दिखता है, हालांकि आप एक स्पष्ट 'ऑर्डर' डाल सकते हैं जो प्रत्येक मान को जांचता है। –

1

मैं बस कुछ कोशिश करना चाहता था। मैंने कार्य ऑफ़सेट का उपयोग किया है। यह आवश्यकता मैं अपने नमूना डेटा के लिए लगता है, लेकिन न पता है अगर इसकी बुलेटप्रूफ सभी तरह:

एसक्यूएल कोड

declare @myt table (country nvarchar(50),percentage int) 
insert into @myt 
values 
('India'  ,12), 
('USA'  ,20), 
('Australia' ,15), 
('Qatar'  ,10), 
('Denmark',10) 



DECLARE @TotalRows int  
SET @TotalRows = (select CEILING(count(*)/2.) from @myt); 

WITH dataset1 AS (
SELECT *,ROW_NUMBER() over(order by country) as rn from (
SELECT Country,percentage from @myt a 
ORDER BY country OFFSET 0 rows FETCH FIRST @TotalRows ROWS ONLY 
) z 
) 

,dataset2 AS (
SELECT *,ROW_NUMBER() over(order by country) as rn from (
SELECT Country,percentage from @myt a  
ORDER BY country OFFSET @TotalRows rows FETCH NEXT @TotalRows ROWS ONLY 
) z 
) 

SELECT * FROM dataset1 a LEFT JOIN dataset2 b ON a.rn = b.rn 

परिणाम

enter image description here

0

आप यह मानते हुए वर्णमाला देश के नाम उतरना चाहते हैं, लेकिन बाएं कॉलम को निर्धारित किया जाता है जहां भारत परिणाम में स्थित है:

with CoutryCTE as (
     select c.* 
      , row_number() over (order by country)-1 as rn 
     from country c 
    ) 
, Col as (
    select rn % 2 as num from CoutryCTE 
    where Country = 'India' 
    ) 
select max(case when rn % 2 = Col.num then country end) as country_1 
    , max(case when rn % 2 = Col.num then percentage end) as percentage_1 
    , max(case when rn % 2 <> Col.num then country end) as country_2 
    , max(case when rn % 2 <> Col.num then percentage end) as percentage_2  
from CoutryCTE 
cross join Col 
group by rn/2 
; 

SQLFiddle Demo

| country_1 | percentage_1 | country_2 | percentage_2 | 
|-----------|--------------|-----------|--------------| 
|  India |   12% | Australia |   15% | 
|  USA |   20% |  Qatar |   10% | 

nb: इस अत्यंत गोर्डन लिनोफ से पहले के एक जवाब के लिए इसी तरह

संबंधित मुद्दे