एसक्यूएल में कॉलम और पंक्तियों को स्थानांतरित करने का सरल तरीका?


110

मैं बस SQL ​​में पंक्तियों के साथ कॉलम कैसे स्विच कर सकता हूं? क्या कोई सरल आज्ञा देना है?

इस परिणाम को चालू करें:

        Paul  | John  | Tim  |  Eric
Red     1       5       1       3
Green   8       4       3       5
Blue    2       2       9       1

इस मामले में:

        Red  | Green | Blue
Paul    1       8       2
John    5       4       2
Tim     1       3       9
Eric    3       5       1

PIVOT इस परिदृश्य के लिए बहुत जटिल लगता है।


1
stackoverflow.com/questions/10699997/… कुछ इसी तरह का प्रश्न है।
टिम डियरबॉर्न

जवाबों:


145

ऐसे कई तरीके हैं जिनसे आप इस डेटा को बदल सकते हैं। अपने मूल पोस्ट में, आपने कहा कि PIVOTइस परिदृश्य के लिए बहुत जटिल लगता है, लेकिन इसे SQL सर्वर में UNPIVOTऔरPIVOT कार्यों दोनों का उपयोग करके बहुत आसानी से लागू किया जा सकता है ।

हालाँकि, यदि आपके पास उन कार्यों तक पहुंच नहीं है, तो इसका उपयोग करके दोहराया जा सकता UNION ALLहै UNPIVOTऔर फिर एक CASEकथन के साथ एक समग्र कार्य PIVOT:

तालिका बनाएं:

CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);

INSERT INTO yourTable
    ([color], [Paul], [John], [Tim], [Eric])
VALUES
    ('Red', 1, 5, 1, 3),
    ('Green', 8, 4, 3, 5),
    ('Blue', 2, 2, 9, 1);

यूनियन ऑल, एग्रीगेट एंड CASE संस्करण:

select name,
  sum(case when color = 'Red' then value else 0 end) Red,
  sum(case when color = 'Green' then value else 0 end) Green,
  sum(case when color = 'Blue' then value else 0 end) Blue
from
(
  select color, Paul value, 'Paul' name
  from yourTable
  union all
  select color, John value, 'John' name
  from yourTable
  union all
  select color, Tim value, 'Tim' name
  from yourTable
  union all
  select color, Eric value, 'Eric' name
  from yourTable
) src
group by name

SQL फिडेल को डेमो के साथ देखें

स्तंभों को अलग-अलग पंक्तियों में परिवर्तित करके डेटा का UNION ALLप्रदर्शन करता है । फिर आप प्रत्येक के लिए नए कॉलम प्राप्त करने के लिए कथन के साथ कुल फ़ंक्शन लागू करते हैं ।UNPIVOTPaul, John, Tim, Ericsum()casecolor

बिना धुरी और धुरी स्थैतिक संस्करण:

SQL सर्वर में फ़ंक्शन UNPIVOTऔर PIVOTफ़ंक्शन दोनों इस परिवर्तन को बहुत आसान बनाते हैं। यदि आप उन सभी मूल्यों को जानते हैं जिन्हें आप बदलना चाहते हैं, तो आप परिणाम प्राप्त करने के लिए उन्हें एक स्थिर संस्करण में हार्ड-कोड कर सकते हैं:

select name, [Red], [Green], [Blue]
from
(
  select color, name, value
  from yourtable
  unpivot
  (
    value for name in (Paul, John, Tim, Eric)
  ) unpiv
) src
pivot
(
  sum(value)
  for color in ([Red], [Green], [Blue])
) piv

SQL फिडेल को डेमो के साथ देखें

आंतरिक क्वेरी के साथ UNPIVOTही कार्य करता है UNION ALL। यह स्तंभों की सूची लेता है और इसे पंक्तियों में बदल देता है, PIVOTफिर स्तंभों में अंतिम परिवर्तन करता है।

डायनामिक पिवट संस्करण:

यदि आपके पास अज्ञात कॉलम ( Paul, John, Tim, Ericआपके उदाहरण में) है और फिर रंग बदलने के लिए अज्ञात संख्या है तो आप डायनामिक sql का उपयोग सूची में UNPIVOTऔर फिर सूची बनाने के लिए कर सकते हैं PIVOT:

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourtable') and
               C.name <> 'color'
         for xml path('')), 1, 1, '')

select @colsPivot = STUFF((SELECT  ',' 
                      + quotename(color)
                    from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select name, '+@colsPivot+'
      from
      (
        select color, name, value
        from yourtable
        unpivot
        (
          value for name in ('+@colsUnpivot+')
        ) unpiv
      ) src
      pivot
      (
        sum(value)
        for color in ('+@colsPivot+')
      ) piv'

exec(@query)

SQL फिडेल को डेमो के साथ देखें

गतिशील संस्करण दोनों प्रश्नों yourtableऔर फिर sys.columnsमेज पर आइटम की सूची उत्पन्न करने के लिए UNPIVOTऔर PIVOT। इसके बाद इसे निष्पादित करने के लिए एक क्वेरी स्ट्रिंग में जोड़ा जाता है। डायनामिक वर्जन का प्लस है यदि आपके पास colors/ और की बदलती सूची है या namesयह रन-टाइम पर सूची जेनरेट करेगा।

सभी तीन प्रश्न समान परिणाम देंगे:

| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric |   3 |     5 |    1 |
| John |   5 |     4 |    2 |
| Paul |   1 |     8 |    2 |
|  Tim |   1 |     3 |    9 |

मुझे इस बात पर जोर देना चाहिए था कि मैं एक डेटाबेस पर एक क्वेरी के परिणामों को स्थानांतरित करने के लिए एक विधि चाहता हूं। एक साधारण ट्रांसपोज़ टाइप कमांड जिसे क्वेरी से सेट किए गए परिणाम पर निष्पादित किया जा सकता है, बिना क्वेरी के बारे में कुछ भी पता किए बिना या कॉलम, टेबल आदि से यह जानकारी निकाल रहा है। कुछ इस प्रकार है: (ट्रांसपोज़ (सेलेक्ट ......)) ऊपर दिए गए मेरे उदाहरण में, कल्पना करें कि पहली तालिका एक परिणाम है जो कई तालिकाओं, यूनियनों, पिवोट्स आदि से युक्त एक बहुत ही जटिल क्वेरी से उत्पन्न है, फिर भी परिणाम एक है। साधारण तालिका। मैं इस परिणाम में पंक्तियों के साथ कॉलम को फ्लिप करना चाहता हूं।
edezzie

मैं एसी # डेटाटेबल का परिणाम दे रहा हूं। मैं इसे करने के लिए एक सरल विधि 'Transpose (Datatable dt)' बना सकता हूं, लेकिन ऐसा करने के लिए SQL में कुछ भी है।
edezzie

@ सादी ऐसा करने के लिए एसक्यूएल में एक सरल तरीका नहीं है। आप संभवतः तालिका नाम में पास होने के लिए डायनामिक संस्करण को बदल सकते हैं और सिस्टम तालिकाओं से जानकारी खींच सकते हैं।
टैरिन

क्या कोई कारण है कि आपने इस शानदार उत्तर को ANSWER के रूप में नहीं भेजा है? @Bluefeet को एक पदक दें!
Fandango68

यह टेबल अनपाइव से * ([पॉल], [जॉन], [टिम], [एरिक]]) में पिवट (अधिकतम (मान) रंग में (रेड), [ग्रीन] के लिए ठीक चयन का काम कर रहा है। , [ब्लू]) पी लेकिन क्या यह संभव है कि टेबल अनप्रीस्ट से यह चयन करें * ([पॉल], [जॉन], [टिम], [एरिक]) के लिए मूल्य (अधिकतम मूल्य) रंग (सेलेक्ट कलर से TABLENAME)) p को उद्धृत मूल्य दर्ज करने के बजाय सीधे चुनिंदा क्वेरी का उपयोग करके मानों को पुनः प्राप्त नहीं कर सकते हैं।
मोगली

20

इसके लिए सामान्य रूप से आपको पहले से सभी कॉलम और पंक्ति लेबल को जानना होगा। जैसा कि आप नीचे दिए गए क्वेरी में देख सकते हैं, लेबल सभी पूरी तरह से UNPIVOT और (re) POTOT संचालन दोनों में पूरी तरह से सूचीबद्ध हैं।

MS SQL सर्वर 2012 स्कीमा सेटअप :

create table tbl (
    color varchar(10), Paul int, John int, Tim int, Eric int);
insert tbl select 
    'Red' ,1 ,5 ,1 ,3 union all select
    'Green' ,8 ,4 ,3 ,5 union all select
    'Blue' ,2 ,2 ,9 ,1;

क्वेरी 1 :

select *
from tbl
unpivot (value for name in ([Paul],[John],[Tim],[Eric])) up
pivot (max(value) for color in ([Red],[Green],[Blue])) p

परिणाम :

| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric |   3 |     5 |    1 |
| John |   5 |     4 |    2 |
| Paul |   1 |     8 |    2 |
|  Tim |   1 |     3 |    9 |

अतिरिक्त नोट्स:

  1. तालिका के नाम को देखते हुए, आप स्थानीय-नाम () का उपयोग करके सभी स्तंभ नामों को sys.columns या XML टोनेरी के लिए निर्धारित कर सकते हैं ।
  2. XML के लिए आप अलग-अलग रंगों (या एक कॉलम के लिए मान) की सूची भी बना सकते हैं।
  3. ऊपर किसी भी तालिका को संभालने के लिए एक गतिशील एसक्यूएल बैच में जोड़ा जा सकता है।

11

मैं SQL में स्तंभों और पंक्तियों को स्थानांतरित करने के लिए कुछ और समाधानों को इंगित करना चाहता हूं।

पहला तरीका है - CURSOR का उपयोग करना। यद्यपि व्यावसायिक समुदाय में आम सहमति एसक्यूएल सर्वर कर्सर से दूर रहने के लिए है, फिर भी ऐसे उदाहरण हैं जहां से कर्सर का उपयोग करने की सिफारिश की जाती है। वैसे भी, कर्सर हमें पंक्तियों को स्तंभों में स्थानांतरित करने के लिए एक अन्य विकल्प के साथ प्रस्तुत करते हैं।

  • कार्यक्षेत्र का विस्तार

    PIVOT के समान, कर्सर में अधिक पंक्तियों को जोड़ने की गतिशील क्षमता है क्योंकि आपके डेटासेट में अधिक पॉलिसी नंबर शामिल करने का विस्तार होता है।

  • क्षैतिज विस्तार

    PIVOT के विपरीत, इस क्षेत्र में कर्सर एक्सेल करता है क्योंकि यह स्क्रिप्ट में बदलाव किए बिना नए जोड़े गए दस्तावेज़ को शामिल करने के लिए विस्तार करने में सक्षम है।

  • प्रदर्शन का टूटना

    CURSOR का उपयोग करके पंक्तियों को स्तंभों में स्थानांतरित करने की प्रमुख सीमा एक नुकसान है जो सामान्य रूप से कर्सर का उपयोग करने से जुड़ा हुआ है - वे महत्वपूर्ण प्रदर्शन लागत पर आते हैं। ऐसा इसलिए है क्योंकि Cursor प्रत्येक FETCH NEXT ऑपरेशन के लिए एक अलग क्वेरी बनाता है।

XML का उपयोग करके पंक्तियों को स्तंभों में बदलने का एक और उपाय है।

स्तंभों में पंक्तियों को स्थानांतरित करने के लिए XML समाधान मूल रूप से PIVOT का एक इष्टतम संस्करण है जिसमें यह गतिशील स्तंभ सीमा को संबोधित करता है।

स्क्रिप्ट का XML संस्करण XML पाथ, डायनेमिक T-SQL और कुछ बिल्ट-इन फ़ंक्शन (जैसे STUFF, QUOTENAME) के संयोजन का उपयोग करके इस सीमा को संबोधित करता है।

  • कार्यक्षेत्र का विस्तार

    PIVOT और Cursor के समान, नई जोड़ी गई नीतियाँ मूल स्क्रिप्ट को बदले बिना स्क्रिप्ट के XML संस्करण में पुनर्प्राप्त करने में सक्षम हैं।

  • क्षैतिज विस्तार

    PIVOT के विपरीत, नए जोड़े गए दस्तावेज़ों को स्क्रिप्ट में फेरबदल किए बिना प्रदर्शित किया जा सकता है।

  • प्रदर्शन का टूटना

    IO के संदर्भ में, स्क्रिप्ट के XML संस्करण के आंकड़े लगभग PIVOT के समान हैं - केवल अंतर यह है कि XML में dtTranspose तालिका का दूसरा स्कैन है लेकिन इस बार तार्किक रीड - डेटा कैश से।

आप इस लेख में इन समाधानों (कुछ वास्तविक टी-एसक्यूएल एक्समैप्स सहित) के बारे में कुछ और जान सकते हैं: https://www.sqlshack.com/multiple-options-to-transposing-rows-into-columns/


8

इसके आधार पर समाधान से bluefeet यहाँ एक संग्रहीत प्रक्रिया गतिशील एसक्यूएल का उपयोग करता है स्थानांतरित कर तालिका उत्पन्न करने के लिए है। इसके लिए आवश्यक है कि ट्रांसपोज़्ड कॉलम (कॉलम जिसके परिणामस्वरूप तालिका में हेडर होगा) को छोड़कर सभी क्षेत्र संख्यात्मक हैं:

/****** Object:  StoredProcedure [dbo].[SQLTranspose]    Script Date: 11/10/2015 7:08:02 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Paco Zarate
-- Create date: 2015-11-10
-- Description: SQLTranspose dynamically changes a table to show rows as headers. It needs that all the values are numeric except for the field using for     transposing.
-- Parameters: @TableName - Table to transpose
--             @FieldNameTranspose - Column that will be the new headers
-- Usage: exec SQLTranspose <table>, <FieldToTranspose>
-- =============================================
ALTER PROCEDURE [dbo].[SQLTranspose] 
  -- Add the parameters for the stored procedure here
  @TableName NVarchar(MAX) = '', 
  @FieldNameTranspose NVarchar(MAX) = ''
AS
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;

  DECLARE @colsUnpivot AS NVARCHAR(MAX),
  @query  AS NVARCHAR(MAX),
  @queryPivot  AS NVARCHAR(MAX),
  @colsPivot as  NVARCHAR(MAX),
  @columnToPivot as NVARCHAR(MAX),
  @tableToPivot as NVARCHAR(MAX), 
  @colsResult as xml

  select @tableToPivot = @TableName;
  select @columnToPivot = @FieldNameTranspose


  select @colsUnpivot = stuff((select ','+quotename(C.name)
       from sys.columns as C
       where C.object_id = object_id(@tableToPivot) and
             C.name <> @columnToPivot 
       for xml path('')), 1, 1, '')

  set @queryPivot = 'SELECT @colsResult = (SELECT  '','' 
                    + quotename('+@columnToPivot+')
                  from '+@tableToPivot+' t
                  where '+@columnToPivot+' <> ''''
          FOR XML PATH(''''), TYPE)'

  exec sp_executesql @queryPivot, N'@colsResult xml out', @colsResult out

  select @colsPivot = STUFF(@colsResult.value('.', 'NVARCHAR(MAX)'),1,1,'')

  set @query 
    = 'select name, rowid, '+@colsPivot+'
        from
        (
          select '+@columnToPivot+' , name, value, ROW_NUMBER() over (partition by '+@columnToPivot+' order by '+@columnToPivot+') as rowid
          from '+@tableToPivot+'
          unpivot
          (
            value for name in ('+@colsUnpivot+')
          ) unpiv
        ) src
        pivot
        (
          sum(value)
          for '+@columnToPivot+' in ('+@colsPivot+')
        ) piv
        order by rowid'
  exec(@query)
END

आप इस आदेश के साथ प्रदान की गई तालिका के साथ इसका परीक्षण कर सकते हैं:

exec SQLTranspose 'yourTable', 'color'

argg। लेकिन मैं एक ऐसा क्षेत्र चाहता हूं जहां सभी क्षेत्र
नवरच

1
सभी क्षेत्रों के लिए nvarchar (अधिकतम) अंत से 6 वीं पंक्ति में अधिकतम (मान) के साथ योग (मान) बदलें
Paco Zarate

2

मैं कर रहा हूँ UnPivotपहली और में परिणाम भंडारण CTEऔर उपयोग CTEमें Pivotआपरेशन।

डेमो

with cte as
(
select 'Paul' as Name, color, Paul as Value 
 from yourTable
 union all
 select 'John' as Name, color, John as Value 
 from yourTable
 union all
 select 'Tim' as Name, color, Tim as Value 
 from yourTable
 union all
 select 'Eric' as Name, color, Eric as Value 
 from yourTable
 )

select Name, [Red], [Green], [Blue]
from
(
select *
from cte
) as src
pivot 
(
  max(Value)
  for color IN ([Red], [Green], [Blue])
) as Dtpivot;

2

ऊपर @Paco Zarate के भयानक उत्तर को जोड़ते हुए, यदि आप एक तालिका को स्थानांतरित करना चाहते हैं जिसमें कई प्रकार के कॉलम हैं, तो इसे पंक्ति 39 के अंत में जोड़ें, इसलिए यह केवल intस्तंभों को स्थानांतरित करता है:

and C.system_type_id = 56   --56 = type int

यहाँ पूरी क्वेरी है जिसे बदला जा रहा है:

select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id(@tableToPivot) and
      C.name <> @columnToPivot and C.system_type_id = 56    --56 = type int
for xml path('')), 1, 1, '')

अन्य खोजने के लिए system_type_id, इसे चलाएं:

select name, system_type_id from sys.types order by name

1

मैं + ब्लूफेट उत्तर के आधार पर एक विभाजित पाठ को स्थानांतरित करने के लिए कोड का उपयोग कर रहा हूं। इस aproach में मैंने MS SQL 2005 में एक प्रक्रिया के रूप में लागू किया है

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      ELD.
-- Create date: May, 5 2016.
-- Description: Transpose from rows to columns the user split function.
-- =============================================
CREATE PROCEDURE TransposeSplit @InputToSplit VARCHAR(8000)
    ,@Delimeter VARCHAR(8000) = ','
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @colsUnpivot AS NVARCHAR(MAX)
        ,@query AS NVARCHAR(MAX)
        ,@queryPivot AS NVARCHAR(MAX)
        ,@colsPivot AS NVARCHAR(MAX)
        ,@columnToPivot AS NVARCHAR(MAX)
        ,@tableToPivot AS NVARCHAR(MAX)
        ,@colsResult AS XML

    SELECT @tableToPivot = '#tempSplitedTable'

    SELECT @columnToPivot = 'col_number'

    CREATE TABLE #tempSplitedTable (
        col_number INT
        ,col_value VARCHAR(8000)
        )

    INSERT INTO #tempSplitedTable (
        col_number
        ,col_value
        )
    SELECT ROW_NUMBER() OVER (
            ORDER BY (
                    SELECT 100
                    )
            ) AS RowNumber
        ,item
    FROM [DB].[ESCHEME].[fnSplit](@InputToSplit, @Delimeter)

    SELECT @colsUnpivot = STUFF((
                SELECT ',' + quotename(C.NAME)
                FROM [tempdb].sys.columns AS C
                WHERE C.object_id = object_id('tempdb..' + @tableToPivot)
                    AND C.NAME <> @columnToPivot
                FOR XML path('')
                ), 1, 1, '')

    SET @queryPivot = 'SELECT @colsResult = (SELECT  '','' 
                    + quotename(' + @columnToPivot + ')
                  from ' + @tableToPivot + ' t
                  where ' + @columnToPivot + ' <> ''''
          FOR XML PATH(''''), TYPE)'

    EXEC sp_executesql @queryPivot
        ,N'@colsResult xml out'
        ,@colsResult OUT

    SELECT @colsPivot = STUFF(@colsResult.value('.', 'NVARCHAR(MAX)'), 1, 1, '')

    SET @query = 'select name, rowid, ' + @colsPivot + '
        from
        (
          select ' + @columnToPivot + ' , name, value, ROW_NUMBER() over (partition by ' + @columnToPivot + ' order by ' + @columnToPivot + ') as rowid
          from ' + @tableToPivot + '
          unpivot
          (
            value for name in (' + @colsUnpivot + ')
          ) unpiv
        ) src
        pivot
        (
          MAX(value)
          for ' + @columnToPivot + ' in (' + @colsPivot + ')
        ) piv
        order by rowid'

    EXEC (@query)

    DROP TABLE #tempSplitedTable
END
GO

मैं ( SQLAuthority.com ) और MSDN ( social.msdn.microsoft.com ) पर विभाजन फ़ंक्शन के बिना आदेश पंक्तियों के बारे में जानकारी के साथ इस समाधान को मिला रहा हूं।

जब आप prodecure निष्पादित करते हैं

DECLARE @RC int
DECLARE @InputToSplit varchar(MAX)
DECLARE @Delimeter varchar(1)

set @InputToSplit = 'hello|beautiful|world'
set @Delimeter = '|'

EXECUTE @RC = [TransposeSplit] 
   @InputToSplit
  ,@Delimeter
GO

आप अगला परिणाम प्राप्त करते हैं

  name       rowid  1      2          3
  col_value  1      hello  beautiful  world

1

इस तरह से सभी डेटा को फाइल (कॉलम) से टेबल टू रिकॉर्ड (पंक्ति) में बदलें।

Declare @TableName  [nvarchar](128)
Declare @ExecStr    nvarchar(max)
Declare @Where      nvarchar(max)
Set @TableName = 'myTableName'
--Enter Filtering If Exists
Set @Where = ''

--Set @ExecStr = N'Select * From '+quotename(@TableName)+@Where
--Exec(@ExecStr)

Drop Table If Exists #tmp_Col2Row

Create Table #tmp_Col2Row
(Field_Name nvarchar(128) Not Null
,Field_Value nvarchar(max) Null
)

Set @ExecStr = N' Insert Into #tmp_Col2Row (Field_Name , Field_Value) '
Select @ExecStr += (Select N'Select '''+C.name+''' ,Convert(nvarchar(max),'+quotename(C.name) + ') From ' + quotename(@TableName)+@Where+Char(10)+' Union All '
         from sys.columns as C
         where (C.object_id = object_id(@TableName)) 
         for xml path(''))
Select @ExecStr = Left(@ExecStr,Len(@ExecStr)-Len(' Union All '))
--Print @ExecStr
Exec (@ExecStr)

Select * From #tmp_Col2Row
Go

0

मैं पाको ज़राटे के समाधान का उपयोग करने में सक्षम था और यह खूबसूरती से काम करता है। मुझे एक पंक्ति ("सेट ANSI_WARNINGS ON") को जोड़ना था, लेकिन यह उस तरह से अद्वितीय हो सकता है जैसे मैंने इसे इस्तेमाल किया या इसे बुलाया। मेरे उपयोग में कोई समस्या है और मुझे आशा है कि कोई मेरी मदद कर सकता है:

समाधान केवल वास्तविक SQL तालिका के साथ काम करता है। मैंने इसे एक अस्थायी तालिका और एक इन-मेमोरी (घोषित) तालिका के साथ आज़माया, लेकिन यह उन लोगों के साथ काम नहीं करता है। इसलिए मेरे कॉलिंग कोड में मैं अपने SQL डेटाबेस पर एक तालिका बनाता हूं और फिर SQLTranspose पर कॉल करता हूं। फिर, यह महान काम करता है। यह वही है जो मैं चाहता हूं। यहाँ मेरी समस्या है:

वास्तव में गतिशील होने के लिए समग्र समाधान के लिए, मुझे उस तालिका को बनाने की आवश्यकता है जहां मैं अस्थायी रूप से तैयार की गई जानकारी को संग्रहीत कर रहा हूं जो कि मैं SQLTranspose "मक्खी पर" भेज रहा हूं, और SQLTranspose कहे जाने पर उस तालिका को हटा दें। टेबल विलोपन मेरी अंतिम कार्यान्वयन योजना के साथ एक समस्या पेश कर रहा है। कोड को एंड-यूज़र एप्लिकेशन (Microsoft एक्सेस फॉर्म / मेनू पर एक बटन) से चलाने की आवश्यकता है। जब मैं इस SQL ​​प्रक्रिया का उपयोग करता हूं (SQL तालिका बनाता है, तो SQLTranspose को कॉल करें, SQL तालिका हटाएं) अंतिम उपयोगकर्ता एप्लिकेशन में एक त्रुटि होती है क्योंकि उपयोग किए गए SQL खाते में तालिका ड्रॉप करने के अधिकार नहीं होते हैं।

इसलिए मुझे लगता है कि कुछ संभावित समाधान हैं:

  1. एक अस्थायी तालिका या घोषित टेबल चर के साथ SQLTranspose काम करने का एक तरीका खोजें।

  2. पंक्तियों और स्तंभों के वाष्पोत्सर्जन के लिए एक अन्य विधि का पता लगाएं जिसकी वास्तविक SQL तालिका की आवश्यकता नहीं है।

  3. तालिका समाप्त करने के लिए मेरे अंतिम उपयोगकर्ताओं द्वारा उपयोग किए जाने वाले SQL खाते की अनुमति देने की एक उपयुक्त विधि का पता लगाएं। यह एक एकल साझा एसक्यूएल खाता है जो मेरे एक्सेस एप्लिकेशन में कोडित है। ऐसा प्रतीत होता है कि अनुमति एक dbo- प्रकार विशेषाधिकार है जिसे प्रदान नहीं किया जा सकता है।

मैं मानता हूं कि इसमें से कुछ दूसरे को अलग कर सकते हैं, अलग धागा और प्रश्न। हालाँकि, चूंकि एक संभावना है कि एक समाधान केवल पंक्तियों और स्तंभों के ट्रांसपोज़िंग करने का एक अलग तरीका हो सकता है इसलिए मैं इस धागे में अपनी पहली पोस्ट यहाँ करूँगा।

EDIT: मैंने भी अंत से 6 वीं पंक्ति में अधिकतम (मूल्य) के साथ योग (मूल्य) को प्रतिस्थापित किया, जैसा कि पाको ने सुझाव दिया था।

संपादित करें:

मुझे कुछ पता चला जो मेरे लिए काम करता है। मुझे नहीं पता कि यह सबसे अच्छा जवाब है या नहीं।

मेरे पास एक रीड-ओनली यूजर अकाउंट है, जिसका इस्तेमाल स्टोरेज प्रक्रियाओं को निष्पादित करने के लिए किया जाता है और इसलिए डेटाबेस से रिपोर्टिंग आउटपुट उत्पन्न होता है। चूंकि SQLTranspose फ़ंक्शन मैंने बनाया था, वह केवल "वैध" तालिका (घोषित तालिका नहीं और अस्थायी तालिका नहीं) के साथ काम करेगा मुझे एक तालिका बनाने के लिए केवल-पढ़ने के लिए उपयोगकर्ता खाते के लिए एक तरीका पता लगाना था (और बाद में हटाएं) एक तालिका ।

मैंने तर्क दिया कि मेरे उद्देश्यों के लिए यह ठीक है कि उपयोगकर्ता खाते के लिए एक तालिका बनाने की अनुमति दी जाए। उपयोगकर्ता अभी भी तालिका को हटा नहीं सका। मेरा समाधान एक स्कीमा बनाना था जहां उपयोगकर्ता खाता अधिकृत हो। फिर जब भी मैं उस तालिका का निर्माण, उपयोग, या हटाता हूं, तो इसे निर्दिष्ट स्कीमा के साथ देखें।

मैंने पहली बार 'sa' या 'sysadmin' खाते से यह आदेश जारी किया था: सृजन SCHAA ro AUTHORIZATION

जब भी मैं अपनी "tmpoutput" तालिका का उल्लेख करता हूं तो मैं इसे इस उदाहरण की तरह निर्दिष्ट करता हूं:

ड्रॉप टेबल ro.tmpoutput


मुझे कुछ पता चला जो मेरे लिए काम करता है। मुझे नहीं पता कि यह सबसे अच्छा जवाब है या नहीं।
क्रेगड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.