Showing posts with label SQL. Show all posts
Showing posts with label SQL. Show all posts

Sunday, November 11, 2012

Exists or not exists- that is the answer


Using more complex queries that can answer simple question like who bought product A but didn't bought product B? Or in another Case: which customers from the customer’s table don’t have an order in the order table ,is one of the abilities that we would like to give for the users and allow them to use it simply and freely as we can.

In order to do that we can use in some cases the sub query method which is good and solid, but in some cases using the Exist \ not exist would be better.
And why is that?

There are first of all performance differences that makes the exists operator make a better work of evaluating which is the driving table and by doing so , use in some cases the appropriate index ,there is also the ability to work with nulls.
For a better understanding of the differences between Exists and subquery read here:





Using the Island resort we will use the Customer and the Sales tables in order to answer a simple question:

Who are the customers who haven’t paid so far?

  1. first we will build the following predefined condition using this syntax:



SELECT Customer.cust_id
FROM Customer

WHERE NOT EXISTS

(select Sales.cust_id from Sale where Customer.cust_id=Sales.cust_id)





  1. We will create a simple query that returns the customers ID’s :

  1. The result will be getting just those customers who don’t have any invoice :




Monday, August 15, 2011

Getting rid of the LOV timestamp

One of the famous problems in Designer is getting rid of the timestamp LOV and sorting the date LOV according to the date column.

Here is the step by step procees in order to achieve that in Oracle:

1.first we have the date object in the universe named :Time Key

2.Inside the object properties we can see the date LOV time stamp:


















3.Now we will create an object that will be used inside the object's LOV,later on we re-map the lov of the date object to this object's LOV:



















this object contain the function to_char in order to format the date object.

4.Inside the time key object properties we will re-map the LOV to the "No time stamp LOV " object and sort it from Z to A

 
5.Now we will get inside the object LOV and esit it's SQL to:

SELECT


to_char(TIME.TIME_KEY,'dd/mm/yyyy')
FROM
TIME
ORDER BY TIME.TIME_KEY

 
 
 
 
 
 
 
 
 

 
the result is :

 
make sure that you thick the "do not genertae" button  and the "export with universe" property of the LOV.

Sunday, August 14, 2011

Time difference calculations for call center - part 1

Here are two scripts that return the time difference between two dates in Oracle:

1.The following script returns the time portion in seperated columns :


SECOUNDS   MINUTES    HOURS    DAYS

     38              8            10           2569 


SELECT TO_CHAR(DATES.TIME_KEY, 'DD/MM/YYYY:HH24:MI:SS') AS TIME_KEY,

TO_CHAR(SYSDATE, 'DD/MM/YYYY:HH24:MI:SS') AS TODAY,
trunc(86400 * (SYSDATE - DATES.TIME_KEY)) -60 * (trunc((86400 * (SYSDATE - DATES.TIME_KEY) / 60))) AS SECOUNDS,trunc((86400 * (SYSDATE - DATES.TIME_KEY)) / 60) -60 *(trunc(((86400 * (SYSDATE - DATES.TIME_KEY)) / 60) / 60)) AS MINUTES,trunc(((86400 * (SYSDATE - DATES.TIME_KEY)) / 60) / 60) -24 *(trunc((((86400 * (SYSDATE - DATES.TIME_KEY)) / 60) / 60) / 24)) AS HOURS,trunc((((86400 * (SYSDATE - DATES.TIME_KEY)) / 60) / 60) / 24) AS DAYS

FROM DATES.TIME_KEY
 

2.The following script returns the time portion in hours,minutes and secounds in one column :

HOURS MINUTES SECOUNDS       
61 :    22 :    11
 
SELECT

TO_CHAR(DATES.TIME_KEY.TIME_KEY, 'DD/MM/YYYY:HH24:MI:SS') AS TIME_KEY,
TO_CHAR(SYSDATE, 'DD/MM/YYYY:HH24:MI:SS') AS TODAY,
(sysdate - nvl(DATES.TIME_KEY.TIME_KEY, sysdate)) * 24 as hour_diff,
floor((SYSDATE - DATES.TIME_KEY.TIME_KEY) * 24) ' : '
mod(floor((SYSDATE - DATES.TIME_KEY.TIME_KEY) * 24 * 60), 60)' : '
mod(floor((SYSDATE - DATES.TIME_KEY.TIME_KEY) * 24 * 60 * 60), 60)' ' time_difference

FROM DATES.TIME_KEY

These scripts can become universe objects and are good for call center calculation

Monday, January 18, 2010

Multi-Pass SQL בסביבת BOXI

 Multi-Pass SQL הוא אחד הנושאים החשובים ביותר בתחום ה-BI ובגדול מתייחס לנושא של שאילתות מורכבות:
כאלו שמורכבות מכמה משפטי select שונים שעוברים אינטגרצייה יחדיו.
בד"כ מי שעובד ב-Query panel מתקשה להגיע לפתרונות מורכבים לשאלות הדורשות חיתוך אוכלוסיות מורכבות,להשוות מדדים בעלי רזולוציה שונה,להשוות מידע מטבלאות fact שונות הוא לבצע פעולות שמבחינת ה-SQL לא נתמכות
כמו in line view ,כיצד ניתן לבצע משפטי SQL מורכבים ב-BOXI ?

הפתרונות רבים ומגוונים ומגיעים בעיקר מכיוון תשתיות ה-DB ומהעולם,הכל במאמר הבא:

http://www.sdn.sap.com/irj/boc/go/portal/prtroot/docs/library/uuid/10ab51df-7964-2b10-7692-93e4dce39277?QuickLink=index&overridelayout=true

Sunday, January 17, 2010

SQL Server Date Formats

בלינק הבא תמצאו כמעט את כל הפורמטים האפשריים להמרת תאריך ב-SQL Server:
http://www.sql-server-helper.com/tips/date-formats.aspx

Thursday, November 12, 2009

Smart Universe Design לפי Steve Krandel

Steve Krandel  נחשב לאחד מהגורואים הגדולים והוותיקים
 של Sap Business Objects ובמצגת הבאה שמגיעה הישר מוועידת
Sap Business Objects 2009 הוא מראה כיצד ליצור Universe
חכם ,קל לפיתוח,זמין למשתמשים וכזה שפותר בעיות מורכבות בדרכים קלות,בין הנושאים שהוא מתייחס אליהם:
בניית טבלת זמן חכמה,טיפול ב- Contexts ו -Aliases ועוד:




Sunday, August 30, 2009

שילוב LOV על בסיס טבלה מעולם בשאילתת- Free Hand.

בעת כתיבת Free Hand והרצתו ב- BO אנו מאבדים את יכולת השימוש ברשימת ערכים מובנית,כלומר את היכולת לבחור ערכים מתוך טבלה ל"טובת" רשימה שאנו יוצרים..
כיצד להתגבר על מגבלה זו כשמדובר על רשימות ערכים גדולות,ארוכות והזקוקות לעדכון יומי?
כיצד לאפשר בחירת ערכים מטבלה על אף מגבלת ה- free hand ? הורידו מכאן את המצגת בעברית:

 http://www.qdrive.net/yoavl/file/39365/8c2151b645bc0b31d049aaa86fc70341

Sunday, July 26, 2009

התנהגות Shortcut Joins

במסמך הבא תוכלו לקרוא על השימוש Shortcut Joins בדיזיינר,מתי להשתמש בהם,מגבלות השימוש בהם ואיך לעקוף מצבים בהם לא ניתן להשתמש ב- Shortcut Joins....
במצגת השנייה תוכלו ללמוד על מגבלות ה - Shortcut Joins :

Wednesday, July 8, 2009

הפרש ימים ב-Oracle:Prompt

היי,

הפונקצייה הבאה מיועדת לדיזיינר ומחשבת את הפרש הימים בין 2 שדות תאריכיים
דוגמא קלאסית:כמה ימים לאחר פתיחת התקלה היא נסגרה:

round(to_number(FND_FACTORING_OFFERS.END_DATE-FND_FACTORING_OFFERS.START_DATE)) >= @Prompt( 'בחר הפרש ימים בין פתיחה לסגירת הצעה הגדול מ','N',
{'0','1','2','3','4','5','6','7','8','9','10','20','30','40','50','60','70','80','90','100','120','150','200','250','300'},mono,free)

שימו לב שיש רשימת ערכים מקודדת על מנת להקל על המשתמש בסבלו.

Thursday, June 25, 2009

שיפור רשימות ערכים עייפות

רשימות ערכים הם לפעמים נושא כאוב.המשתמש מחכה זמן רב,בכדי לקבל את רשימת הערכים,לעיתים דקות רבות.
כיצד נוכל לקצר את זמן הפתיחה שלהם לשניות ומדוע זה קורה ?
על כך בצמד הקבצים הבא:
1.מצגת קצרה בעברית כתובה ע"י עבדכם:

http://www.qdrive.net/yoavl/file/5645/15bdc862c0f1fe0f255408c151b41d5a


2.ומי שרוצה לרדת ממש לעומק מוזמן לקרוא כאן את המצגת שנכתבה ע"י Michael Aarons ומכילה גםכמה טריקים מגניבים של Prompts:

http://www.qdrive.net/yoavl/file/5646/2090aedef6783a97b8d618015a11653b


Sunday, June 7, 2009

DB Hints ב - Designer

Hints הינו אמצעי המגיע מכיוון ה- DB וה- SQL ומאפשר ע"י יצירתו השפעה מיטבית על תוכנית האופטימיזצייה של ה- SQL הנשלח ל- DB :לפי ה- Index ,לפי ה- Join לפי ה- Access paths
כיצד לשלבם בעולם באופן חכם אשר יתאים לג'ננה הפרטית של כל שאילתא ?

A database hint is a keyword that developers can use to influence the database optimizer’s plan for a query ,Join methods,Index usage,Access paths Many times indexes exist, but for many reasons the database optimizer chooses not to use them Hints are required to be placed at the beginning of the SQL string Hints can be implemented in Business Objects by creating dimension objects to store the hint

אובייקט ה-HINT חייב להיות האובייקט הראשון בבניית השאילתא:

Sunday, May 10, 2009

Query the Universe’s Reports

באמצעות הסקריפט הבא תוכלו למצוא את השאילתות שמגיעות מעולם מסויים:
SELECT
si_id,si_name,si_webi,si_cuid
FROM
CI_AppObjects
WHERE si_name = 'UNIVERSE_NAME' AND si_kind = 'Universe'

בהצלחה...

Saturday, December 13, 2008

בניית תת-שאילתא קוארלטיבית ב - Designer

נניח שיש לנו טבלה שמכילה מידע על הלקוחות.בכל פעם שהלקוח רוכש מוצר כל שהוא מתווספת שורה חדשה לטבלה,שורה שמצד אחד מציינת את תאריך הקנייה החדש ומצד שני מאפשרת לשמור את היסטוריית הקניות של הלקוח מאחר וצבירת התאריכים נשמרת.אם נשלוף את הנתונים כפי שהם נקבל את כל התאריכים של הלקוח :

אולם אם נרצה לשלוף עבור כל לקוח את התאריך הנוכחי בכדי לאפשר להסתכל על מצבו העכשווי נצטרך להשתמש בתת-שאילתא קוארלטיבית אותה נוכל לשלב כתנאי בעולם.
תת-שאילתא קוארלטיבית היא תת-שאילתא מיוחדת שקרויה גם repeating sub query.
למה ? מאחר והיא חוזרת על עצמה.בדוגמא שלפנינו תת - השאילתא מחזירה עבור כל לקוח את התאריך האחרון שלו .תת-השאילתא סורקת את רשומות הלקוח מוצאת את התאריך הנוכחי שלו ועוברת ללקוח הבא,מוצאת את התאריך המקסימלי שלו וכך הלאה,עד שהיא מסיימת לעבור על כלל הלקוחות.

על מנת לאפשר את ה"לופיות" הזו אנו בונים alias כנגד טבלת הלקוחות בכדי לאפשר את ההשוואה החוזרת הזו (קוראלצייה...) של כל לקוח ולקוח.
קוראלציית ה- alias מתרחשת on the fly ונשבץ אותה בפסוקית ה- From כתנאי בעולם.

טבלת ה – s1 היא טבלת ה-alias ואנו מביאים את השורה הנוכחית (המקסימלית...) ע"י שימוש בפונקציית ה-max על שדה ה- invoice_date :

Sales.invoice_date = (select max ( s1.invoice_date )
from sales s1
(where s1.cust_id = Sales.cust_id

התוצאה:לכל לקוח מוחזר תאריך הקנייה האחרון:

יש לקחת בחשבון: מאחר ותהליך ביצוע התת-השאילתא הקוראלטיבית יכול להיות יקר במשאבים מאחר והוא חוזר על עצמו שוב ושוב יש לבחון במקרה הצורך שיפור ביצועים ע"י שימוש ב- partitions או index כאשר צריך לבדוק מה הפתרון המתאים ביותר שיציע ה- DBA או ע"י אנליזה עצמאית שתערכו על השאילתא.

Friday, November 28, 2008

ANSI 92 - פרמטר ב-Designer

החל מגרסא 6 ניתן לשנות את הגדרות ה- SQL בעולם בכלל ובאובייקטים נבחרים בפרט על מנת ליצור אופטימיזצייה של ה- SQL בשאילתות,להלן האפשרויות,אך נקדים ונאמר כי הפיצ'ר נתמך ברוב ה- DB's ,
ב- Oracle רק החל מגרסא 10,על כן בדקו קודם שסוג וגרסאת ה-DB שלכם תומכת בפיצ'ר זה.

אז מה הוא נותן לנו ? דרך תפריט ה-file-->parameters ,לשונית ה-parameter
נשנה את הפרמטר הראשון ANSI 92 מ- N ל- Y :

כעת נבחין במס' שינויים ביכולות העולם:

1. ניתן לבצע Full Outer Join בין טבלאות :


2. רוב ה- DB's זורקים את ה- Joins לפסוקית ה- Where (טרה לא...)

ANSI 92 מעביר אותם אל פסוקית ה- From:
לפני:

אחרי השינוי ל-ANSI 92 :


המשמעות היא שה- SQL שנוצר כעת עשוי להיות אופטימלי מאחר וה- Joins מתבצעים כבר ברמת ה- From ,כך שכמות הרשומות שהשאילתא צריכה לעבד מצטמצמת כשמגיעים ל- where

(ארקדי ודימה אומרים שתמיד עדיף ככה וכך גםה-execution plan של ה-SQL...)

3.אפשרויות עריכה מתקדמות ב- Join

אפשרות זו קובעת איזה אובייקטים שהמשתתש בוחר בתנאי השאילתא יעברו לפסוקית ה- From,כאשר ניתן לבחור בחלונית זו רק את אותם אובייקטים המבוססים על הטבלאות ב- Join,המשמעות היא שוב שביצועי השאילתא עשויים להיות טובים יותר...


















א.אפשרות ראשונה :
Default behavior / No objects in FROM = אובייקטי התנאי נשארים בפסוקית ה-FROM :

ב.אפשרות שניה :
כל- All objects in FROM= אובייקטי התנאי יועברו ל- FROM :

ג.אפשרות שלישית:

Selected objects in FROM = רק האובייקטים הנבחרים יועברו לפסוקית ה- FROM


בסה"כ הכל ANSI 92 נותן אפשרויות שליטה מתקדמות בייצור ה-SQL הגנרי בעולם ויכול לשפר את כל מבנה העולם.עכשיו מה שנשאר לכם זה רק לדבר עם איגור ה-DBA שיבדוק האם יש באמת שיפור בשאילתות....

Sunday, November 23, 2008

Prompt:הקלד מס' אותיות וקבל את כל הערכים

במקרים בהם המשתמש זקוק לפרומפט שיאפשר לו להקליד מס ' אותיות ולקבל את כל הערכים הדומים המתחילים בצירוף זה נוכל לבנות Prompt בעולם,לדוגמא:

המשתמש מקליד את האותיות se ומקבל את כל הערכים שמתחילים בצירוף זה
service 1service 2 וכו'...

חשוב לזכור:פונקציית ה- Like המאפשרת את החיפוש והמציאה, מתאימה לשדות מסוג Character
חיפוש בהתחלה:

tablename.culomn_name like @variable('type the first letters') +'%'

חיפוש בסוף:

CUSTOMER.name like '%' + @variable('type the first letters')

Saturday, November 22, 2008

General Best Practices in Universe Design

מצ"ב לינק למצגת המתארת בקווים כלליים (יש תמונות!) איך ליצור Universe יעיל,המצגת מתאימה לדייזנרים בתחילת דרכם
וגם למנוסים שהיו רוצים לקרוא בכלליות על יסודות ה-Designer :

http://www.gaboug.org/archive/200809_UniverseBestPractices.ppt

פרמטר דינמי בדיזיינר : END_SQL

מורי ורבי Dr.Z אמר לי פעם שאפשר לבנות פתרון אבטחה ב-2 שקל ואפשר לבנות פתרון אבטחה ב-100 אלף שקל.
אז הנה לכם פתרון אבטחה (חלקי כמובן) ב- 2 שקל:
החל מגירסא 6 ,חלק מהפרמטרים שנוהלו בעבר בקובץ ה - prm עברו לעולם,אחד מהם הוא פרמטר ה - END_SQL המאפשר לכם להוסיף ל- SQL המיוצר בכל שאילתא הערה בסוף הסקריפט.

המשמעות ?

אפשר להכניס את שם העולם,הדוח ואת שם המשתמש על מנת לאפשר ל- DBA לעלות על זהות המשתמש הרצחני באמצעות SQL Profiler או כלי ניטור דומה...

כיצד חוסכים שקלים רבים ?

צעד ראשון:

נכנסים לתיבת הפרמטרים בעולם ומכניסים את ההערה הרלוונטית לפרמטר ה- END_SQL
ושם נכניס את ההערה הבאה:

/* Universe Sales, user @variable('BOUSER')*/

בהערה כתבנו את שם העולם ואת משתנה ה- BOUSER המציג את שם המשתמש :



אחרי שאישרנו את הוספת ההערה ע"י הקלקה על כפתורית ה- Replace

ניתן לראות בסוף ה- SQL שאנו מייצרים בעולם את ההערה:

באמצעות כלי ה- Trace SQL הקיימים ברשותנו נוכל לחזות ב- SQL + מאיזה עולם ואיזה משתמש הריץ
את ה - SQL.

לפרמטר הנ"ל אפשר להוסיף גם את המשתנה :
/* Universe Name - User @Variable('BOUSER') Report @Variable('DOCNAME')*/

ואז גם שם הדוח יופיע בסקריפט ה- SQL.

תבלו.

Wednesday, November 19, 2008

ניתוח סטטיסיטי עם Oracle על גבי עולם

regression ו correlation ? סטטיסיטיקות מגעילות במיוחד בשילוב עם ה- BO ?
הנה דוגמא ליישם על Oracle 10g תוך כדי שילוב פונקציות משתמש בעולם:

Wildcard Prompts ב- Designer

במצגת הבאה תוכלו לראות כיצד לבנות prompt המאפשר חיפוש ערך לפי אות תחילית/סופית

Tuesday, November 18, 2008

טריק:איך לתזמן דוח רק במידה והוא מחזיר נתונים

ליצור אובייקט בעולם שיספור את כמות הרשומות בדוח ושלב אותו בשאילתא נוספת עם אותם התנאים כחלק מהדוח,

משהו כמו (מתאים ל- SQL server ) :

=CAST(CASE count(*) WHEN 0 THEN '0 rows returned forced SQL error' ELSE count(*) END AS int)

מאחר ו- SQL server לא יכול לבצע cast על ההודעה הוא יייצר הודעת שגיאה ייזומה מה שיפיל את ה- Instance והדוח לא יתוזמן ועל כן גם לא ישלח,במידה ויוחזרו רשומות,הריצה תתבצע כרגיל,הדוח ישלח ליעדו ותוכלו לחגוג עם החבר'ה בהרמת כוסית קפה.

אם אתם על Oracle תצטרכו לחקות את ה-SQL עם תחביר מקביל או דומה.