هوش تجاری (Business Intelligence)

هوش تجاری (Business Intelligence)

به اشتراک بگذاریم برای یادگیری، یاد بگیریم برای به اشتراک گذاری
هوش تجاری (Business Intelligence)

هوش تجاری (Business Intelligence)

به اشتراک بگذاریم برای یادگیری، یاد بگیریم برای به اشتراک گذاری

Running Total

مساله:

 جدولی در یک دیتابیس بانکی وجود دارد که اطلاعات تراکنش های مشتریان بانک در آن ذخیره می شود. به گزارشی نیاز داریم که لیست تراکنش های مشتریان به همراه موجودی حساب مشتری را پس از هر تراکنش نمایش دهد.


01

تصویر 1


راه حل:

تکنیکی به نام Running Total وجود دارد که از آن برای محاسبه سرجمع مقادیر یک ستون از اولین سطر تا سطر جاری استفاده می شود.

استفاده از این تکنیک یکی از بهترین راه کارهای سیستم های مالی، انبارداری و ... می باشد. روش های متفاوتی برای استفاده از تکنیک Running Total وجود دارد که در این مقاله با روش های Sub Query، Join و Window Function به صورت Set Based بررسی می شود.


کوئری های این تمرین برروی جدولی شامل تراکنش های بانکی انجام میشود.

ستون UserID شناسه کاربری، ستون TransactionID شناسه تراکنش و ستونQuantity  مبلغ تراکنش انجام شده را در خود ذخیره می کنند. این جدول دارای اطلاعات تراکنش های دو کاربر با شناسه های 1 و 2 است که هر کدام تعداد 10 تراکنش داشته اند.


تصویر 2



دیتابیسی با نام Test (یا هر اسم دلخواه دیگر) ساخته و کد زیر را اجرا کرده تا جدول مورد نظر ساخته شود.


  1. USE    Test;--DataBase Name
  2. IF      OBJECT_ID('dbo.TransactTable', 'U') IS NOT NULL DROP TABLE dbo.TransactTable;
  3. CREATE TABLE  dbo.TransactTable
  4. (
  5.    UserID INT NOT NULL
  6. ,  TransactionID INT NOT NULL
  7. Quantity INT NULL
  8. ,  CONSTRAINT PK_TransactTable PRIMARY KEY CLUSTERED
  9.          (
  10.       UserID ASC
  11.    ,  TransactionID ASC
  12.    )
  13. );
  14. INSERT INTO dbo.TransactTable (UserID, TransactionID, Quantity) VALUES
  15.               (1, 1, 50),( 2, -7),(1, 3, 10),(1, 4, 3), (1, 5, -2),(1, 6, 3),(1, 7, -1)
  16.      ,(1, 8, 17),(1, 9, -6),(1, 10, 1),(2, 1, 10),(2, 2, 5),(2, 3, 4),(2, 4, 7),
  17.      (2, 5, -9),(2, 6, 90),(2, 7, -10),(2, 8, -5),(2, 9, -7),(2, 10, -50);

کد ساخت جدول


Sub Query:

در این روش کوئری درونی(کوئریی که خروجی آن بوسیله کوئری دیگر استفاده می شود) UserIDهای برابر با UserIDهای کوئری بیرونی(کوئریی که از خروجی کوئری درونی استفاده می کند) و TransactionIDهای کوچکتر از TransactionIDهای کوئری بیرونی را فیلتر کرده، سپس مجموع فیلدهای ستون Quantity را محاسبه می کند و در ستونی به نام Balance نمایش می دهد. این عملیات به ازای هر یک از رکوردهای کوئری بیرونی، یک بار انجام می شود.

  1. SELECT     UserID
  2. ,          TransactionID
  3. ,          Quantity
  4. ,          (
  5.               SELECT     SUM(T2.Quantity)
  6.               FROM       dbo.TransactTable    AS     T2
  7.               WHERE      T2.TransactionID     =      T1.TransactionID
  8.                          AND
  9.                          T2.TransactionID     <=     T1.TransactionID
  10.            )  AS         Balance
  11. FROM       dbo.TransactTable    AS     T1;


کوئری اجرای Running Total به وسیله Sub Query



Join:

انجام Running Total به وسیله Join مانند روش Sub Query می باشد. در این روش جدول TransactTable با خودش Join زده می شود و شرط Join آن UserIDهای برابر و TransactionIDهای بزرگتر مساوی جدول اول از TransactionIDهای جدول دوم  می باشد. حاصل جوین جدول TransactTable با خودش بر اساس شرط های گفته شده، به ازای هر UserID و TransactionID جدول اول، TransactionIDهای کوچکتر مساوی آن UserID تکرار می شود. سپس سرجمع ستون Quantity محاسبه شده و بر اساس ستون های UserID و TransactionID دسته بندی(GROUP BY) می شود.


  1. SELECT        T1.UserID
  2. ,             T1.TransactionID
  3. ,             T1.Quantity
  4. ,             SUM(T2.Quantity)     AS     Balance
  5. FROM          dbo.TransactTable    AS     T1
  6. INNER JOIN    dbo.TransactTable    AS     T2
  7.         ON    T2.UserID            =      T1.UserID
  8.               AND
  9.               T2.TransactionID     <=     T1.TransactionID
  10. GROUP BY      T1.UserID
  11. ,             T1.TransactionID
  12. ,             T1.Quantity;


کوئری اجرای Running Total به وسیله Join



Window Function:

با آمدن Window Function به SQL، پیاده سازی Running Total بسیار آسان تر و کم هزینه تر شد. در این روش ستون Quantity را در تابع SUM قرار داده و در OVER، پارتیشن(PARTITION BY) را UserID قرار داده و ترتیب(ORDER BY) را بر اساس TransactionID اعمال میکنیم. محاسبه سرجمع، از اولین رکورد (UNBOUNDED PRECEDING) هر پارتیشن تا سطر جاری(CURRENT ROW) که سرجمع در حال درج در ستون Balance است، انجام می شود.

  1. SELECT     UserID
  2. ,          TransactionID
  3. ,          Quantity
  4. ,          SUM(Quantity) OVER(PARTITION BY UserID ORDER BY TransactionID
  5.               ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)             AS     Balance
  6. FROM       dbo.TransactTable ;


کوئری اجرای Running Total به وسیله Window Function

 

 

مقایسه Execution Planها:

در جدولی که کوئری های فوق بر روی آن اجرا شده است، ستون های UserID و TransactionID کلید اصلی می باشند.


 

لازم به ذکر است که هزینه اجرای کوئری های فوق، می تواند با افزایش تعداد تراکنش ها نسبت به تعداد کاربران و یا بالعکس، متغیر باشد.

 





منبع: برگرفته از کتاب Microsoft SQL Server 2012 High-Performance T-SQL Using Window Functions نوشته Itzik Ben-Gan

آیا دوران پادشاهی اوراکل در حوزه‌ی مدیریت پایگاه‌های داده عملیاتی به پایان رسیده است؟

از سال 1970 تا به حال سیستم‌های مدیریت پایگاه داده عملیاتی – ODBMS - مختلفی ایجاد شده‌اند. بعضی از آنها به مرور زمان از بین رفته‌اند و برخی قدرتمند‌تر شده‌اند. در دهه‌های اخیر بین سیستم‌های مدیریت پایگاه داده عملیاتی، محصولات شرکت‌های اوراکل، مایکروسافت، IBM و SAP از بقیه موفق‌تر بوده‌اند. اما مسلما در این بین بهترین سیستم مدیریت پایگاه داده، محصول شرکت اوراکل بوده است و سخن گزافی نیست که بگوییم محصول شرکت اوراکل در دهه‌های اخیر در بین محصولات دیگر شرکت‌ها پادشاهی می‌کرده است .

تا حدود 4 سال پیش بین کیفیت oracle db و sql server اختلاف فاحشی وجود داشت. چه از نظر سرعت و چه از نظر دیگر امکانات، اوراکل کاملا برتر از رقیب خود بود. در نسخه‌ی sql server 2012، امکانات قابل توجهی به محصول شرکت مایکروسافت افزوده شد. از مهمترین این امکانات می‌توان به ویژگی AlwaysOn و ColumnStore Index‌ها اشاره کرد. امکانات این نسخه باعث شد که اختلاف بین oracle db و sql server تا حدی کاهش یابد. مایکروسافت سرانجام در نسخه‌ی sql server 2014 خود تغییرات اساسی بوجود آورد. مهمترین این تغییرات ایجاد موتور درونی In-Memory OLTP می‌باشد که برای تراکنش‌های درون حافظه بهینه شده است. با استفاده از امکانات این نسخه می‌توان بدون نیاز به دوباره نویسی محصولات، سرعت اجرای کوئری‌های آنها را به طور متوسط ده برابر کرد. در شکل ذیل ساختار جدید sql server مشاهده می‌شود.

منبع و ادامه مطلب

SSIS و کاربرد آن در پروژه

شرکت ماکروسافت سرویس SSIS را برای ایجاد راه‌حل‌های مختلف جهت مدیریت و انتقال داده‌ها فراهم کرده است.

با یک مثال به معرفی بهتر SSIS می‌پردازم؛ فرض کنید توسط  SSAS یک پروژه‌ی بزرگ سازمانی که شامل چندین Cube، Dimension، KPI و ... است، ایجاد کرده‌اید و از آنجایی که در این پروژه از روش ذخیره‌سازی MOLAP استفاده شده، در هر بار به روز رسانی داده‌ها در انبار داده باید مکعب‌های داده و ابعاد نیز پردازش شوند. از طرفی نه درست است و نه منطقی که کاربر نهایی هر روز وارد SSAS شود و Solution را پردازش کند.

بهترین روشی که برای حل این مشکل معرفی می‌شود، استفاده از SSIS است. در SSIS با ایجاد یک Package و استفاده از کامپننت‌های مربوطه این کار به راحتی انجام می‌شود. کاربرد SSIS تنها برای پردازش Solution‌ها نیست. در واقع SSIS یک پلت‌فرم (Platform) سطح بالا برای فراهم کردن راهکارهای مختلف جهت مدیریت و انتقال اطلاعات است. از این سرویس برای کپی کردن یا دانلود فایل، ارسال و دریافت ایمیل، به‌روز رسانی انبار داده، پاکسازی و کاوش در داده‌ها، مدیریت شیء‌ها  (Objects) و داده‌های SQL استفاده می‌شود. علاوه بر این SSIS توانایی استخراج (Extract) و تبدیل کردن (Transform) داده‌ها از فایل‌های داده‌ای XML و منابع داده رابطه‌ای و بارگذاری (Load) در یک یا چند مقصد را دارد. 

گرافیکی بودن ابزارها از دیگر مزایای SSIS است. به سادگی می‌توان از این ابزارها برای ساخت Package استفاده نمود بدون نیاز به حتی یک خط کد نویسی! البته در صورت نیاز به کد نویسی ابزار و شرایط آن فراهم است.

هر پکیج دارای یک یا چند کامپننت است که می‌توانند به تنهایی و یا با ترکیبی از هم اجرا شوند. هر پکیج نیز می‌تواند به تنهایی یا با هماهنگی با سایر پکیج‌ها اجرا شود.

آشنایی با INTERSECT و EXCEPT

معمولا برای مقایسه رکوردهای دو جدول از کوئری‌های پیچیده استفاده می‌شود. دو دستور INTERSECT و EXCEPT نتایج مقایسه رکوردهای دو کوئری را بدون نمایش رکوردهای تکراری نمایش می‌دهد.

EXCEPT رکوردهایی که در کوئری اول (سمت چپ) وجود دارد و در کوئری دوم (سمت راست) وجود ندارد را نمایش می‌دهد.به زبان ساده‌تر، رکوردهایی که در اولی هست و در دومی نیست.

INTERSECT رکوردهایی که در هر دو کوئری مشترک هستند را نمایش می‌دهد.

به دو کوئری زیر توجه کنید  

 

 

USE AdventureWorks;

GO

SELECT ProductID

FROM Production.Product

INTERSECT

SELECT ProductID

FROM Production.WorkOrder ;

--Result: 238 Rows (products that have work orders)

 

در دو جدول  Product و WorkOrder تعداد 238 رکورد وجود دارد که ProductID آن‌ها مشترک است.  

 

USE AdventureWorks;

GO

SELECT ProductID

FROM Production.Product

EXCEPT

SELECT ProductID

FROM Production.WorkOrder ;

--Result: 266 Rows (products without work orders)

 

تعداد 266 رکورد وجود دارد که ProductID آن‌ها در جدول Product (اولی) وجود دارد و در جدول WorkOrder (دومی) وجود ندارد. 

جهت دریافت و نصب بانک اطلاعاتی AdventureWorks  به اینجا مراجعه کنید.

منبع:

 http://msdn.microsoft.com/en-us/library/ms188055(v=sql.100).aspx

نحوه خواندن داده‌ها از شیرپوینت و بارگذاری در SQL توسط SSIS

امروزه استفاده از شیرپوینت به عنوان ابزار ایجاد کننده وب‌ سایت‌ به دلیل سرعت بالا در ایجاد و راه‌اندازی، بسیار گسترش پیدا کرده است و بسیاری از سازمان‌ها از آن استفاده می‌کنند. بنابراین می‌توان شیرپوینت را به عنوان منبع داد‌ه‌ها در نظر گرفت.

برای خواندن و بارگذاری داده‌های شیرپوینت در SQL Server از طریق SSIS چندین روش وجود دارد که در این مقاله به یکی از بهترین و ساده‌ترین آن‌ها که استفاده از SharePoint Web services است، می‌پردازم.


متن بالا مقدمه ای از مقاله "نحوه خواندن داده ها از شیرپوینت و بارگذاری در SQL توسط SSIS" است که میتوانید با مراجعه به لینک زیر و پرداخت هزینه اندکی آن را دریافت نمایید.

http://spdor.ir/p/83/ssis-sharepoint