برنامه نویسی

تعداد نامشخص اما ستون معمولی به ردیف: از SQL به SPL#5

پایگاه داده MS SQL دارای یک جدول غیر استاندارد تولید شده خارجی است که N جفت قسمت و یک رکورد را در یک زمان تولید می کند. هر جفت نام میدانی به دو قسمت جدا شده توسط زیرکرها تقسیم می شود که نیمه اول یکسان اما ناشناخته است و نیمه دوم نام و سن ثابت است.

شرح تصویر
حال ما باید نیمه اول هر جفت نام فیلد و مقادیر میدانی مربوط به آنها را در یک رکورد ، برای کل سوابق N ترکیب کنیم. ابتدا می توانید این رکورد را از ستون به ردیف تبدیل کنید و سپس هر دو رکورد را به یک ردیف جمع کنید.

شرح تصویر
راه حل SQL

SELECT V.id,
       MAX(CASE V.subkey WHEN N'name' THEN OJ.value END) AS name,
       MAX(CASE V.subkey WHEN N'age' THEN OJ.value END) AS age
FROM (SELECT *
      FROM dbo.tb YT
      FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) J(JSON)
     CROSS APPLY OPENJSON (J.JSON) OJ
     CROSS APPLY (VALUES(LEFT(OJ.[key],NULLIF(CHARINDEX('_',OJ.[Key]),0)-1), STUFF(OJ.[Key],1,NULLIF(CHARINDEX('_',OJ.[Key]),0),'')))V(id,subkey)
GROUP BY V.id;
SELECT V.id,
       MAX(CASE V.subkey WHEN N'name' THEN OJ.value END) AS name,
       MAX(CASE V.subkey WHEN N'age' THEN OJ.value END) AS age
FROM (SELECT *
      FROM dbo.tb YT
      FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) J(JSON)
     CROSS APPLY OPENJSON (J.JSON) OJ
     CROSS APPLY (VALUES(LEFT(OJ.[key],NULLIF(CHARINDEX('_',OJ.[Key]),0)-1), STUFF(OJ.[Key],1,NULLIF(CHARINDEX('_',OJ.[Key]),0),'')))V(id,subkey)
GROUP BY V.id;

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

SQL عملکرد محوری دارد که می تواند ستون را به ردیف تبدیل کند ، اما باید نام ستون ها نوشته شود. نام ستون تولید پویا بسیار پیچیده خواهد بود. در اینجا ، ما فقط می توانیم تفکر را تغییر دهیم. ابتدا رکورد را به یک رشته JSON تبدیل کنید ، سپس چندین “نام فیلد: مقادیر فیلد” را به طور جداگانه بگیرید و سپس از Cross Join برای هجی کردن چندین سوابق استفاده کنید. مشکل کد زیاد است. جابجایی SQL بسیار انعطاف پذیر است ، بنابراین در اینجا ما از گروه Max … به روش استفاده می کنیم تا به طور غیرمستقیم آن را پیاده سازی کنیم ، و کد نیز کمی کلامی است.

کد SPL بسیار ساده تر و آسان تر است:

شرح تصویر
داده های بار A1.

A2: برای تبدیل ستون به ردیف ، از عملکرد Pivot استفاده کنید ، نیازی به نوشتن نام ستون نیست. جدول دو بعدی جدید دارای 6 رکورد و 2 زمینه است که Field Col نام اصلی را در آن ذخیره می کند و ردیف را ذخیره می کند و مقدار اصلی آن را ذخیره می کند.

A3 : اجرای ساده گروه بندی هر 2 ردیف ، و زیر مجموعه های گروه بندی را می توان بدون تجمع حفظ کرد. # شماره ردیف است ، \ تقسیم به دور است.

A4 : مقادیر هر گروه از سوابق را با موقعیت برای تشکیل یک جدول دو بعدی جدید دریافت کنید. ~ 1 نشان دهنده اولین رکورد در گروه است.

SPR منبع باز و رایگان است ، برای امتحان کردن خوش آمدید ، تعجب دیگری را برای شما به ارمغان می آورد!

آدرس منبع باز

بارگیری رایگان

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا