2011-02-26 9 views
39

मेरे पास एक टेबल है।तालिका 45 डिग्री घुमाएं और परिणाम को दूसरी तालिका में कैसे सहेजें?

--------- 
| a | b | 
--------- 
| a | b | 
--------- 

मैं इसे 45 डिग्री (घड़ी की दिशा में या घड़ी के विपरीत) घुमाने और इसे किसी अन्य तालिका में सहेजना चाहता हूं। उदाहरण के लिए, अगर मैं इसे बारी बारी से 45 डिग्री वामावर्त, यह हो जाएगा:

------------- 
| b | | | 
------------- 
| a | b | | 
------------- 
| a | | | 
------------- 

एक अन्य उदाहरण है, जब मैं बारी बारी से

------------- 
| a | b | c | 
------------- 
| d | e | f | 
------------- 
| g | h | i | 
------------- 

यह कैसे करने के लिए

--------------------- 
| c | | | | | 
--------------------- 
| b | f | | | | 
--------------------- 
| a | e | i | | | 
--------------------- 
| d | h | | | | 
--------------------- 
| g | | | | | 
--------------------- 

के लिए बदल जाएगा SQL में ऐसा करें?

+0

@Richard मैं SQL सर्वर 2005 या 2008 –

+2

उपयोग कर रहा हूँ मैं जान सकती हूँ घूर्णन के उद्देश्य क्या है टेबल मान 45 डिग्री करने के लिए? – RGS

उत्तर

64

एक पूरी तरह से काम कर रहा उदाहरण
यदि आप किसी अन्य प्रणाली के लिए इसकी आवश्यकता है, वहाँ समकक्ष हैं (SQL सर्वर 2005+ के लिए)

    के नीचे पहेली के टुकड़ों के लिए
  • ROW_NUMBER()
  • dense_rank()
  • संयुक्त राष्ट्र/धुरी

आप अन्य Stackoverflow सवालों से समकक्ष पा सकते हैं। उदाहरण के लिए, पहले दो ओरेकल और डीबी 2 द्वारा समर्थित हैं।

create table t45 (id int identity, colA char(1), colX char(1), colZ char(1)) 
insert t45 select 'a','b','c' 
insert t45 select 'd','e','f' 
insert t45 select 'g','h','i' 
GO 

select [1],[2],[3],[4],[5] -- for N columns, this goes to N*2-1 
from 
(
    select value, 
     targetRow = row+col-1, 
     targetCol = ROW_NUMBER() over (partition by row+col-1 order by row) 
    from 
    (
     select *, 
      row = DENSE_RANK() over (order by id), 
      col = ROW_NUMBER() over (partition by id order by 
       CASE source when 'colA' then 3 -- number in reverse 
          when 'colX' then 2 
          when 'colZ' then 1 end) 
     from t45 
     unpivot (value for source in (colA,colX,colZ)) upv 
    ) x 
) p        -- for N columns, this goes to N*2-1 
pivot (max(value) for targetCol in ([1],[2],[3],[4],[5])) pv 
order by targetRow 

आप मनमाने ढंग से किसी भी तालिका पर लागू करने की जरूरत है - गतिशील एसक्यूएल का उपयोग पैटर्न ऊपर दिखाए उत्पन्न करने के लिए।

+5

धन्यवाद रिचर्ड, आप वास्तव में एक एसक्यूएल गुरु हैं! –

+13

यह एसओ पर देखी गई सबसे बुद्धिमान चीजों में से एक है। यहां तक ​​कि पूरी तरह से सैद्धांतिक मूल्य के लिए, मैं इसे 45 डिग्री के गुणकों के लिए समझाया और सामान्यीकृत ब्लॉग में देखना चाहता हूं। शानदार रिचर्ड। क्षमा करें अगर मैं एक प्रशंसक लड़के की तरह लग रहा हूं, लेकिन मैं वास्तव में इस से आश्चर्यचकित हूं :) –

+2

ypercube के आउटपुट प्राप्त करने के लिए, 'targetCol = ROW_NUMBER() ..' 'targetCol = ABS (3 - (पंक्ति + col-1) में बदलें -1 + 2 * ROW_NUMBER() .. अगर – RichardTheKiwi

3

इसे सीधे SQL में करने का कोई आसान तरीका नहीं है।

मेरा सुझाव है कि आप परिणाम को जावा, पीएचपी, पायथन या किसी भी तरह के प्रोग्रामिंग वातावरण में आयात करें, इस संदर्भ में समस्या को हल करें, और फिर (यदि आवश्यक हो) परिणाम को वापस डीबी में डाल दें।

8

तालिका

--------- 
| a | b | 
--------- 
| a | b | 
--------- 

45 डिग्री नहीं घुमाया चाहिए वामावर्त इस तरह हो सकता है?

------------- 
| | b | | 
------------- 
| a | | b | 
------------- 
| | a | | 
------------- 

और

------------- 
| a | b | c | 
------------- 
| d | e | f | 
------------- 
| g | h | i | 
------------- 

कुछ की तरह:

--------------------- 
| | | c | | | 
--------------------- 
| | b | | f | | 
--------------------- 
| a | | e | | i | 
--------------------- 
| | d | | h | | 
--------------------- 
| | | g | | | 
--------------------- 
+4

यह कोई जवाब नहीं है। – aioobe

+23

नहीं, लेकिन मैं इन तालिकाओं को एक टिप्पणी के अंदर पेस्ट नहीं कर सका। उत्तर देने का प्रयास करने से पहले हम समस्या के स्पष्ट वर्णन के लायक हैं, है ना? –

+5

ypercube - एक और कदम (बाईं ओर फ्लश) और आपके पास प्रश्न संरचना – RichardTheKiwi

0

क्रॉस के साथ के लिए SQLServer2008 + विकल्प लागू और धुरी ऑपरेटरों

CREATE TABLE dbo.test77 
(
    id int IDENTITY, 
    colA char(1), 
    colB char(1), 
    colC char(1) 
) 

INSERT dbo.test77 
VALUES('a','b','c'), 
     ('d','e','f'), 
     ('g','h','i') 

SELECT [1], [2], [3], [4], [5] 
FROM (
     SELECT COALESCE(o.colA, o.colB, o.colC) AS Val, 
      'Col' + CAST(ROW_NUMBER() OVER (ORDER BY id) AS nvarchar(1)) AS ColName 
     FROM dbo.test77 t CROSS APPLY (
            VALUES(colA, NULL, NULL), 
              (NULL, colB, NULL), 
              (NULL, NULL, colC) 
            ) o(colA, colB, colC) 
    ) p 
PIVOT (
MAX(Val) FOR ColName IN ([Col1], [Col2], [Col3], [Col4], [Col5], [Col6], [Col7], [Col8], [Col9]) 
) pvt CROSS APPLY (
        VALUES ([Col3], NULL, NULL, NULL, NULL), 
          ([Col2], [Col6], NULL, NULL, NULL), 
          ([Col1], [Col5], [Col9], NULL, NULL), 
          ([Col4], [Col8], NULL, NULL, NULL), 
          ([Col7], NULL, NULL, NULL, NULL) 
        ) o([1], [2], [3], [4], [5]) 

डेमो पर SQLFiddle

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