এসকিউএলে কলাম এবং সারি স্থানান্তর করার সহজ উপায়?


110

এসকিউএল-এ সারিগুলির সাহায্যে আমি কীভাবে কলামগুলি স্যুইচ করব? স্থানান্তর করার জন্য কোনও সহজ আদেশ আছে?

অর্থাত্ এই ফলাফলটি ঘুরিয়ে দিন:

        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এই দৃশ্যের জন্য খুব জটিল বলে মনে হচ্ছে তবে এটি এসকিউএল সার্ভারে 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

ডেমো সহ এসকিউএল ফিডল দেখুন

UNION ALLসঞ্চালিত UNPIVOTডেটার কলাম রূপান্তর দ্বারা Paul, John, Tim, Ericপৃথক সারি মধ্যে। তারপরে আপনি প্রতিটিটির জন্য নতুন কলামগুলি পেতে বিবৃতি sum()সহ সামগ্রিক ফাংশনটি প্রয়োগ করুন ।casecolor

আনপিভট এবং পিভট স্ট্যাটিক সংস্করণ:

এসকিউএল সার্ভারে 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

ডেমো সহ এসকিউএল ফিডল দেখুন

UNPIVOTপারফরম্যান্স সহ অভ্যন্তরীণ ক্যোয়ারী একই ফাংশন সম্পাদন করে UNION ALL। এটি কলামগুলির তালিকা নেয় এবং এটিকে সারিগুলিতে পরিণত করে, PIVOTতারপরে চূড়ান্ত রূপান্তরকে কলামগুলিতে করে।

গতিশীল পিভট সংস্করণ:

আপনার যদি অজানা সংখ্যক কলাম থাকে ( Paul, John, Tim, Ericআপনার উদাহরণে) এবং তারপরে রূপান্তর করতে অজানা সংখ্যক রঙের তালিকা তৈরি করতে আপনি গতিশীল এসকিএল ব্যবহার করতে পারেন 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)

ডেমো সহ এসকিউএল ফিডল দেখুন

গতিশীল সংস্করণ উভয় জিজ্ঞাস্য 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 |

আমার জোর দেওয়া উচিত ছিল যে একটি ডাটাবেসে কোয়েরির ফলাফল স্থানান্তরের জন্য আমি একটি পদ্ধতি চাই। একটি সাধারণ ট্রান্সপোজ টাইপ কমান্ড যা ক্যোয়ারী থেকে নিজের ফলাফল, বা কলাম, টেবিল ইত্যাদি সম্পর্কে কিছু না জেনে ফলাফল থেকে সেট ফলাফলের উপর কার্যকর করা যেতে পারে বা এটি থেকে তথ্য বের করা হচ্ছে। এর মতো কিছু: (ট্রান্সপোস (নির্বাচন করুন ......) উপরে বর্ণিত আমার উদাহরণে, কল্পনা করুন যে প্রথম টেবিলটি একাধিক টেবিল, ইউনিয়ন, পিভটস ইত্যাদি জড়িত একটি খুব জটিল কোয়েরি থেকে প্রাপ্ত ফলাফল সেট Yet তবুও ফলাফলটি একটি সাধারণ টেবিল আমি এই ফলটিতে সারিগুলির সাথে কলামগুলি কেবল উল্টাতে চাই।
এডেজি

আমি ফলাফল # এসটি ডাটাবেলে পাস করছি। এটি করার জন্য আমি একটি সাধারণ পদ্ধতি 'ট্রান্সপোজ (ডেটাটেবল ডিটি)' তৈরি করতে পারি তবে এসকিউএল-তে এটি করার জন্য কিছু আছে কি না।
এডেজি

@dezzie এসকিউএল করার এটি করার কোনও সহজ উপায় নেই। আপনি সম্ভবত টেবিলের নামটি পাস করার জন্য গতিশীল সংস্করণ পরিবর্তন করতে পারেন এবং সিস্টেম টেবিলগুলি থেকে তথ্যটি টানতে পারেন।
তারিন

উত্তরটি উত্তর হিসাবে আপনি এই উজ্জ্বল উত্তরটিকে পতাকাঙ্কিত না করার কোনও কারণ আছে কি? @ ব্লুফিটকে একটি পদক দিন!
Fandango68

এটি টেবিল আনপিবট (* [পল], [জন], [টিম], [এরিক]) তে নামের জন্য মান) ([লাল], [সবুজ] রঙের জন্য পিভট (সর্বাধিক (মান) থেকে নির্বাচন করুন * ভাল কাজ করছে , [নীল])) পি কিন্তু টেবিল আনপাইভট থেকে এই নির্বাচনটি লিখতে সম্ভব (([পল], [জন], [টিম], [এরিক]) তে নামের জন্য মান) পিভট (সর্বোচ্চ (মান)) এর জন্য (ট্যাবলেয়াম থেকে রঙ নির্বাচন করুন) পি-তে রঙ ক্লিক করে উদ্ধৃত মান প্রবেশের পরিবর্তে নির্বাচিত প্রশ্নগুলি ব্যবহার করে মানগুলি পুনরুদ্ধার করতে পারে না।
মোগলি

20

এটির জন্য সাধারণত আপনাকে সমস্ত কলাম এবং সারি লেবেল আগেই জেনে রাখা দরকার। আপনি নীচের ক্যোয়ারিতে দেখতে পাচ্ছেন, লেবেলগুলি তাদের সম্পূর্ণরূপে UNPIVOT এবং (পুনরায়) পিভট ক্রিয়াকলাপ উভয়টিতেই তালিকাভুক্ত রয়েছে।

এমএস এসকিউএল সার্ভার 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. একটি টেবিলের নাম দেওয়া হয়েছে, আপনি স্থানীয় কলাম () ব্যবহার করে সিসকোলোমগুলি থেকে বা এক্সএমএল ট্র্যাটারি থেকে সমস্ত কলামের নাম নির্ধারণ করতে পারেন ।
  2. আপনি এক্সএমএল ব্যবহার করে স্বতন্ত্র রঙের তালিকা (বা এক কলামের মান )ও তৈরি করতে পারেন।
  3. উপরেরগুলিকে কোনও সারণী পরিচালনা করতে ডায়নামিক স্কয়ার ব্যাচে একত্রিত করা যেতে পারে।

11

এসকিউএল-এ কলাম এবং সারি পরিবহনের আরও কয়েকটি সমাধান আমি উল্লেখ করতে চাই।

প্রথমটি হ'ল CURSOR ব্যবহার করা। যদিও পেশাদার সম্প্রদায়ের সাধারণ sensক্যমত্যটি এসকিউএল সার্ভার কার্সার থেকে দূরে থাকবে, এখনও এমন কিছু উদাহরণ রয়েছে যার মাধ্যমে কার্সার ব্যবহারের পরামর্শ দেওয়া হয়। যাইহোক, কার্সাররা সারিগুলিকে কলামগুলিতে স্থানান্তর করার জন্য অন্য একটি বিকল্প দিয়ে আমাদের উপস্থাপন করে।

  • উল্লম্ব প্রসার

    PIVOT এর অনুরূপ, কার্সার আরও নীতি সংযোজন করার গতিশীল ক্ষমতা আছে কারণ আপনার ডেটাসেটটি আরও নীতি সংখ্যা অন্তর্ভুক্ত করার জন্য প্রসারিত করে।

  • অনুভূমিক প্রসার

    পিভট-এর বিপরীতে, স্ক্রিপ্টটি পরিবর্তন না করে নতুনভাবে যুক্ত হওয়া দস্তাবেজ অন্তর্ভুক্ত করতে প্রসারিত করতে সক্ষম হওয়ায় কার্সারটি এই অঞ্চলে ছাড়িয়ে যায়।

  • পারফরম্যান্স ব্রেকডাউন

    CURSOR ব্যবহার করে কলামগুলিতে সারি পরিবহনের প্রধান সীমাবদ্ধতা হ'ল একটি অসুবিধা যা সাধারণভাবে কার্সার ব্যবহারের সাথে যুক্ত হয় - এগুলি উল্লেখযোগ্য পারফরম্যান্স ব্যয়ে আসে। কার্সার প্রতিটি FETCH নেক্সট ক্রিয়াকলাপের জন্য একটি পৃথক ক্যোয়ারী উত্পন্ন করার কারণ এটি।

কলামগুলিতে সারি স্থানান্তর করার আরেকটি সমাধান হ'ল এক্সএমএল ব্যবহার করে।

সারিগুলিকে কলামগুলিতে স্থানান্তর করার জন্য এক্সএমএল সমাধানটি মূলত পিআইওওওটি-র একটি অনুকূল সংস্করণ যাতে এটি গতিশীল কলামের সীমাবদ্ধতা দেখায়।

স্ক্রিপ্টের এক্সএমএল সংস্করণ এক্সএমএল পাথ, গতিশীল টি-এসকিউএল এবং কিছু অন্তর্নির্মিত ফাংশনগুলির (যেমন এসটিইউএফএফ, কোয়েটইম) সংমিশ্রণ ব্যবহার করে এই সীমাবদ্ধতাটিকে সম্বোধন করে।

  • উল্লম্ব প্রসার

    পাইভট এবং কার্সারের মতো, নতুন যুক্ত নীতিগুলি মূল স্ক্রিপ্টটি পরিবর্তন না করে স্ক্রিপ্টের এক্সএমএল সংস্করণে পুনরুদ্ধার করতে সক্ষম।

  • অনুভূমিক প্রসার

    পিভট-এর বিপরীতে, সদ্য যুক্ত হওয়া দস্তাবেজগুলি স্ক্রিপ্ট পরিবর্তন না করে প্রদর্শিত হতে পারে।

  • পারফরম্যান্স ব্রেকডাউন

    আইও এর শর্তে, স্ক্রিপ্টের এক্সএমএল সংস্করণের পরিসংখ্যানগুলি প্রায় পাইভটের সাথে মিল - কেবলমাত্র পার্থক্যটি হ'ল এক্সএমএলটিতে ডিটি ট্রান্সপোজ টেবিলের দ্বিতীয় স্ক্যান রয়েছে তবে এবার লজিকাল রিড - ডেটা ক্যাশে থেকে।

আপনি এই নিবন্ধগুলিতে এই সমাধানগুলি (কিছু প্রকৃত টি-এসকিউএল এক্সপামেলস সহ) সম্পর্কে আরও কিছু জানতে পারেন: https://www.sqlshack.com/m Multiple-options-to-transposing-rows-into-colال/


8

এর উপর ভিত্তি করে নীলফীট থেকে সমাধানের ভিত্তিতে এখানে একটি সঞ্চিত প্রক্রিয়া যা ট্রান্সপোজড টেবিলটি তৈরি করতে গতিশীল এসকিউএল ব্যবহার করে। এটির জন্য প্রয়োজন যে ট্রান্সপোজড কলাম ব্যতীত সমস্ত ক্ষেত্রগুলি সংখ্যাসূচক (কলাম যে ফলাফলটি সারণীতে শিরোনাম হবে):

/****** 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 (সর্বাধিক) কেবল শেষ থেকে 6th ষ্ঠ লাইনে সর্বাধিক (মান) দিয়ে যোগফল (মান) পরিবর্তন করুন
পাকো জারাতে

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

উপরের @ পাকো জারাতে এর ভয়ঙ্কর উত্তরে যুক্ত করা, আপনি যদি একাধিক ধরণের কলাম রয়েছে এমন একটি টেবিল স্থানান্তর করতে চান তবে এটি 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

আমি + ব্লুফিট উত্তরের উপর ভিত্তি করে বিভক্ত টেক্সট স্থানান্তর করতে যে কোডটি ব্যবহার করছি তা ভাগ করতে চাই। এই অ্যাপ্রোচটিতে আমি এমএস এসকিউএল 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 ) আদেশ ছাড়াই সারি সারি অর্ডার করার তথ্য এবং এমএসডিএন ( social.msdn.microsoft.com ) এ বিভক্ত ফাংশন সম্পর্কিত তথ্যের সাথে এই সমাধানটি মিশ্রণ করছি

আপনি যখন প্রোডিকিউর চালাবেন

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

আমি প্যাকো জারাতে এর সমাধানটি ব্যবহার করতে সক্ষম হয়েছি এবং এটি সুন্দরভাবে কাজ করে। আমাকে একটি লাইন যুক্ত করতে হয়েছিল ("সেট এএনএসআই_ওয়ার্ডিংস চালু করুন"), তবে এটি যেভাবে আমি এটি ব্যবহার করেছি বা এটি বলেছিলাম তার থেকে এটি অনন্য কিছু হতে পারে। আমার ব্যবহারে একটি সমস্যা আছে এবং আমি আশা করি যে কেউ এটির সাথে আমাকে সহায়তা করতে পারে:

সমাধানটি কেবল একটি আসল এসকিউএল টেবিলের সাথে কাজ করে। আমি এটি একটি অস্থায়ী টেবিল এবং একটি মেমোরি (ঘোষিত) টেবিল দিয়ে চেষ্টা করেছি কিন্তু এটিগুলির সাথে এটি কার্যকর হয় না। সুতরাং আমার কলিং কোডে আমি আমার এসকিউএল ডাটাবেসে একটি টেবিল তৈরি করি এবং তারপরে এসকিউএল ট্রান্সপোজ কল করি। আবার, এটি দুর্দান্ত কাজ করে। এটি আমি যা চাই ঠিক তাই। আমার সমস্যাটি এখানে:

সামগ্রিক সমাধানটি সত্যিকারের গতিশীল হওয়ার জন্য আমাকে সেই টেবিলটি তৈরি করতে হবে যেখানে আমি এসকিউএলটি ট্রান্সপোজকে "উড়ানের দিকে" প্রেরণ করছি যে প্রস্তুত তথ্য অস্থায়ীভাবে সংরক্ষণ করব এবং এসকিউএলআর ট্রান্সপোজ বলা হয়ে গেলে সেই টেবিলটি মুছুন। টেবিল মোছা আমার চূড়ান্ত বাস্তবায়ন পরিকল্পনার সাথে একটি সমস্যা উপস্থাপন করছে। কোডটি শেষ-ব্যবহারকারী অ্যাপ্লিকেশন (মাইক্রোসফ্ট অ্যাক্সেস ফর্ম / মেনুতে একটি বোতাম) থেকে চালানো দরকার। আমি যখন এই এসকিউএল প্রক্রিয়াটি ব্যবহার করি (একটি এসকিউএল টেবিল তৈরি করুন, এসকিউএলটি ট্রান্সপোজ কল করুন, এসকিউএল টেবিলটি মুছুন) শেষ ব্যবহারকারীর অ্যাপ্লিকেশনটি একটি ত্রুটি হিট করে কারণ ব্যবহৃত এসকিউএল অ্যাকাউন্টটিতে কোনও টেবিল ফেলে দেওয়ার অধিকার নেই।

সুতরাং আমি বুঝতে পারি যে কয়েকটি সম্ভাব্য সমাধান রয়েছে:

  1. অস্থায়ী টেবিল বা ঘোষিত টেবিলের পরিবর্তনশীল সহ এসকিউএলআর ট্রান্সপোজকে কাজ করার কোনও উপায় সন্ধান করুন।

  2. সারি এবং কলামগুলি স্থানান্তর করার জন্য অন্য একটি পদ্ধতি আবিষ্কার করুন যার জন্য সত্যিকারের এসকিউএল টেবিলের প্রয়োজন হয় না।

  3. আমার শেষ ব্যবহারকারীদের দ্বারা ব্যবহৃত এসকিউএল অ্যাকাউন্টকে একটি টেবিল ফেলে দেওয়ার অনুমতি দেওয়ার উপযুক্ত পদ্ধতিটি আবিষ্কার করুন। এটি আমার একসেস অ্যাপ্লিকেশনটিতে কোডযুক্ত একটি একক ভাগ করা এসকিউএল অ্যাকাউন্ট। এটি প্রদর্শিত হয় যে অনুমতি হ'ল একটি ডিবিও-ধরনের সুযোগ-সুবিধা।

আমি স্বীকার করি যে এর কিছুটি অন্য একটি, পৃথক থ্রেড এবং প্রশ্নের ওয়ারেন্ট দিতে পারে। যাইহোক, যেহেতু একটি সলিউশন সারি এবং কলামগুলি স্থানান্তর করার সহজ উপায় হতে পারে এমন একটি সম্ভাবনা রয়েছে আমি এই থ্রেডে এখানে আমার প্রথম পোস্ট করব।

সম্পাদনা: প্যাকোর পরামর্শ অনুসারে, আমি শেষ থেকে 6th ষ্ঠ লাইনে সর্বোচ্চ (মান) দিয়ে যোগফল (মান) প্রতিস্থাপন করেছি।

সম্পাদনা করুন:

আমি আমার জন্য কাজ করে এমন কিছু আবিষ্কার করেছি। আমি জানি না এটি সেরা উত্তর কিনা ।

আমার কাছে কেবল পঠনযোগ্য ব্যবহারকারী অ্যাকাউন্ট রয়েছে যা স্টোরড পদ্ধতিগুলি সম্পাদন করতে ব্যবহৃত হয় এবং তাই একটি ডাটাবেস থেকে রিপোর্টিং আউটপুট উত্পন্ন করে। যেহেতু আমি তৈরি করেছি এসকিউএল ট্রান্সপোজ ফাংশনটি কেবলমাত্র "বৈধ" টেবিলের সাথে কাজ করবে (কোনও ঘোষিত টেবিল নয় এবং একটি অস্থায়ী টেবিল নয়) আমাকে কেবল একটি পঠনযোগ্য ব্যবহারকারী অ্যাকাউন্টের জন্য একটি টেবিল তৈরি করতে (এবং পরে মুছে ফেলতে) একটি উপায় খুঁজে বের করতে হয়েছিল ।

আমি যুক্তি দিয়েছিলাম যে আমার উদ্দেশ্যগুলির জন্য এটি ঠিক আছে যে ব্যবহারকারীর অ্যাকাউন্টটিকে একটি সারণী তৈরি করার অনুমতি দেওয়া হবে। যদিও ব্যবহারকারী এখনও সারণীটি মুছতে পারেন নি। আমার সমাধানটি ছিল এমন একটি স্কিমা তৈরি করা যেখানে ব্যবহারকারী অ্যাকাউন্ট অনুমোদিত। তারপরে আমি যখনই সেই টেবিলটি তৈরি করি, ব্যবহার করি বা মুছি তা নির্দিষ্ট স্কীমার সাথে উল্লেখ করে।

আমি প্রথমে একটি 'সা' বা 'সিসাদমিন' অ্যাকাউন্ট থেকে এই আদেশটি জারি করেছি: স্কিমা রো কর্তৃপক্ষকে তৈরি করুন

যখনই আমি আমার "টেম্পআউটপুট" টেবিলটি উল্লেখ করি তখন আমি এটিকে উদাহরণের মতো নির্দিষ্ট করি:

ড্রপ টেবিল ro.tmpoutput


আমি আমার জন্য কাজ করে এমন কিছু আবিষ্কার করেছি। আমি জানি না এটি সেরা উত্তর কিনা ।
ক্রেগডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.