TSQL পিভট সমষ্টিগত ফাংশন ছাড়াই


139

আমার মতো টেবিল আছে ...

CustomerID   DBColumnName   Data
--------------------------------------
1            FirstName      Joe
1            MiddleName     S
1            LastName       Smith
1            Date           12/12/2009
2            FirstName      Sam
2            MiddleName     S
2            LastName       Freddrick
2            Date           1/12/2009
3            FirstName      Jaime
3            MiddleName     S
3            LastName       Carol
3            Date           12/1/2009

এবং আমি এটি চাই ...

পিভট ব্যবহার করে এটি কি সম্ভব?

CustomerID  FirstName   MiddleName          LastName        Date
----------------------------------------------------------------------
1           Joe             S               Smith           12/12/2009
2           Sam             S               Freddrick       1/12/2009
3           Jaime           S               Carol           12/1/2009

উত্তর:


102

আপনি MAX সমষ্টি ব্যবহার করতে পারেন, এটি এখনও কার্যকর হবে। এক মানের সর্বোচ্চ = সেই মান ..

এই ক্ষেত্রে, আপনি গ্রাহকরেডে 5 বার স্ব-যোগদান করতে পারেন, প্রতি টেবিলে রেফারেন্সে ডিবি কলমনেম দ্বারা ফিল্টার করতে পারেন। এটি আরও ভাল কাজ করতে পারে।



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

7
উদাহরণ হিসাবে কিছু কোড / মশকরা দুর্দান্ত হত এবং এই উত্তরটি পুরোপুরি সম্পূর্ণ করে দিয়েছিল।
ডেভিডশেয়ার

167

হ্যাঁ কিন্তু কেন !!??

   Select CustomerID,
     Min(Case DBColumnName When 'FirstName' Then Data End) FirstName,
     Min(Case DBColumnName When 'MiddleName' Then Data End) MiddleName,
     Min(Case DBColumnName When 'LastName' Then Data End) LastName,
     Min(Case DBColumnName When 'Date' Then Data End) Date
   From table
   Group By CustomerId

2
^^ এটি আমার পক্ষে কাজ করেছিল। PIVOT অ-সংখ্যাসূচক মানের জন্য দক্ষ নয়।
Dienekes

6
এটি একটি দুর্দান্ত বিকল্প। আমি Pivotআমার ক্যোয়ারীটি ব্যবহার করছিলাম, তারপরে আমি এটিতে স্যুইচ করেছি এবং উভয়কে এক সাথে চালানোর জন্য কার্যকরকরণ পরিকল্পনার দিকে নজর রেখেছি। এই পদ্ধতির ব্যয় 8% এবং পাইভট পদ্ধতির ব্যয় 92%!
মাফিউ

2
@ চার্লসব্রেটানা, আপনি দুর্দান্ত! তুমি আমার প্রাণ বাঁচিয়েছ! ) এটিই সেরা সমাধান। ধন্যবাদ!
চাকি_ব্ল্যাক

3
সত্যই এই সমাধানটি পছন্দ করুন, এটি কলামগুলিতে পিভট একের পরিবর্তে সঠিক ডেটা রয়েছে তাও নিশ্চিত করে, ধন্যবাদ!
টেনিরেজা

2
এই কাজ দুর্দান্ত! তবে আমি কীভাবে প্রতিরোধ করবWarning: Null value is eliminated by an aggregate or other SET operation
GiddyUpHorsey

23
WITH pivot_data AS
(
SELECT customerid, -- Grouping Column
dbcolumnname, -- Spreading Column
data -- Aggregate Column
FROM pivot2 
)
SELECT customerid, [firstname], [middlename], [lastname]
FROM pivot_data
PIVOT (max(data) FOR dbcolumnname IN ([firstname],[middlename],[lastname])) AS p;

3
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি টিএসকিউএল পিভট কমান্ডটির যথাযথ ব্যবহার দেখায়।
উবারকোডার

1
এটি লক্ষণীয় যে এই ক্যোয়ারিতে, "পিভট 2" হ'ল টেবিলের নাম যেখানে মূল ডেটা থাকে। এছাড়াও, এখানে সিটিই ব্যবহার অতিরিক্ত ব্যবহারযোগ্য - SELECTসিটিই এর নীচের বিবৃতিটি কেবলমাত্র সারণির নাম নির্দিষ্ট করতে পারে।
এসটিএলডিভ

@ এসটিএলডিভ আসলে এসটিএলডিভ এটি কীভাবে পিভট কাজ করে না। "Pivot2" টেবিলের সমস্ত কলাম আমরা জানি না। অন্য কলামগুলিতে ওপি সারণিতে রয়েছে তা নির্দিষ্ট করে না। সুতরাং আপনি যদি কলামগুলি সীমাবদ্ধ না করেন - সিটিই বা উত্পন্ন টেবিল ক্যোয়ারী ব্যবহার না করে - তারপরে সারণীতে থাকা সমস্ত কলামগুলি গ্রুপিংয়ে ব্যবহৃত হয়। অন্য কথায়, পিভট কিছু প্রত্যাবর্তন করে তবে আমরা প্রত্যাশা করি না। এটি 70-761 শংসাপত্র পরীক্ষার জন্য গভীরভাবে কভার করা একটি ধারণা।
জোরকোলোট

2
এটি লক্ষণীয় যে পিভট স্বয়ংক্রিয়ভাবে কখনই পিভট মধ্যে কলামগুলি ব্যবহৃত হয় না তার দ্বারা ভাগ করে নেয় groups সুতরাং এই উদাহরণে [ডেটা] এবং [ডিব্লোকলনাম] পিভট-এ রয়েছে তাই সবকিছুকে [গ্রাহকআইডি] দ্বারা ভাগ করা হবে
সাল

9
SELECT
main.CustomerID,
f.Data AS FirstName,
m.Data AS MiddleName,
l.Data AS LastName,
d.Data AS Date
FROM table main
INNER JOIN table f on f.CustomerID = main.CustomerID
INNER JOIN table m on m.CustomerID = main.CustomerID
INNER JOIN table l on l.CustomerID = main.CustomerID
INNER JOIN table d on d.CustomerID = main.CustomerID
WHERE f.DBColumnName = 'FirstName' 
AND m.DBColumnName = 'MiddleName' 
AND l.DBColumnName = 'LastName' 
AND d.DBColumnName = 'Date' 

সম্পাদনা করুন: আমি এডিটর ছাড়াই এটি লিখেছি এবং এসকিউএল চালাচ্ছি না। আমি আপনি ধারণা পেতে আশা করি.


9

ঠিক আছে, খারাপ প্রশ্নের জন্য দুঃখিত। gbn আমাকে সঠিক পথে পেয়েছে। আমি উত্তরটিতে এটিই খুঁজছিলাম।

SELECT [FirstName], [MiddleName], [LastName], [Date] 
FROM #temp 
PIVOT
(   MIN([Data]) 
    FOR [DBColumnName] IN ([FirstName], [MiddleName], [LastName], [Date]) 
)AS p

তারপরে আমাকে কিছুক্ষণের স্টেটমেন্টটি ব্যবহার করতে হবে এবং উপরের স্টেটমেন্টটি ভারচর হিসাবে তৈরি করতে হবে এবং ডায়নামিক স্কোয়েল ব্যবহার করতে হয়েছিল।

এই জাতীয় কিছু ব্যবহার

SET @fullsql = @fullsql + 'SELECT ' + REPLACE(REPLACE(@fulltext,'(',''),')','')
SET @fullsql = @fullsql + 'FROM #temp '
SET @fullsql = @fullsql + 'PIVOT'
SET @fullsql = @fullsql + '('
SET @fullsql = @fullsql + ' MIN([Data])'
SET @fullsql = @fullsql + ' FOR [DBColumnName] IN '+@fulltext
SET @fullsql = @fullsql + ')'
SET @fullsql = @fullsql + 'AS p'

EXEC (@fullsql)

কিছুক্ষণ লুপ ব্যবহার করে @ ফুলটেক্সট তৈরি করতে এবং টেবিলের বাইরে স্বতন্ত্র কলামের নাম নির্বাচন করুন। উত্তরের জন্য ধন্যবাদ।


6

ওপিকে প্রকৃতপক্ষে একীকরণ ছাড়াই পিভট করার দরকার ছিল না তবে আপনারা যারা এখানে আসেন তাদের কীভাবে দেখুন:

sql প্যারামিটারাইজড সিটি কোয়েরি

এই প্রশ্নের উত্তরের এমন একটি পরিস্থিতি জড়িত যেখানে সমষ্টি ছাড়াই পাইভট প্রয়োজন তাই এটি করার একটি উদাহরণ সমাধানের অংশ।


1

এটা চেষ্টা কর:

SELECT CUSTOMER_ID, MAX(FIRSTNAME) AS FIRSTNAME, MAX(LASTNAME) AS LASTNAME ...

FROM
(

SELECT CUSTOMER_ID, 
       CASE WHEN DBCOLUMNNAME='FirstName' then DATA ELSE NULL END AS FIRSTNAME,
       CASE WHEN DBCOLUMNNAME='LastName' then DATA ELSE NULL END AS LASTNAME,
        ... and so on ...
GROUP BY CUSTOMER_ID

) TEMP

GROUP BY CUSTOMER_ID


1

একটি পিভট ক্যোয়ারির জন্য গতিশীল ক্ষেত্রগুলি তৈরি করার একটি দুর্দান্ত উপায় এখানে রয়েছে:

- একটি tmp টেবিলের মান সংক্ষিপ্ত করে

declare @STR varchar(1000)
SELECT  @STr =  COALESCE(@STr +', ', '') 
+ QUOTENAME(DateRange) 
from (select distinct DateRange, ID from ##pivot)d order by ID

--- উত্পন্ন ক্ষেত্রগুলি দেখুন

print @STr

exec('  .... pivot code ...
pivot (avg(SalesAmt) for DateRange IN (' + @Str +')) AS P
order by Decile')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.