גרופ בי מרובה אפשרויות SQL SERVER
-
ידוע לי מראש שהסיכויים קלושים, אבל בכל זאת אשאל, האם יש אפשרות לעשות משפט גרופ בי, כאשר בכל עמודה יופיע ערך לפי תנאי שונה
למשל: יש לי טבלה של שעות עבודה, אני רוצה לעשות עמודות כמה שעות עבדת היום, כמה שעות אתמול, כמה שעות השבוע, והחודש. כל אחד בפני עצמו אפשר לקבל על ידי סלקט עם תנאי שהתאריך גדול או שוה ל ולעשות גרופ בי ו sum, כשאני בא לעשות לכל עמודה תנאי שונה, זה בלתי אפשרי.
הפתרון הוא טבלה זמנית כמובן, השאלה אם למישהו יש רעיון אחר, במקום לכתוב עכשיו פרוצדורה כאורך מגילת אסתר (זה לא רק שעות עבודה, זה עוד הרבה סטטיסטיקות שצריך להכניס).
פורסם במקור בפורום CODE613 ב27/10/2014 12:30 (+02:00)
-
משהו כזה?
SELECT Creator, SUM(CASE WHEN CAST(CreateDate AS DATE) > CAST(GETDATE() AS DATE) THEN TotalSC ELSE 0 END) AS Future, SUM(CASE WHEN CAST(CreateDate AS DATE) <= CAST(GETDATE() AS DATE) THEN TotalSC ELSE 0 END) AS Past FROM PO_Header GROUP BY Creator
פורסם במקור בפורום CODE613 ב27/10/2014 12:48 (+02:00)
-
משהו כזה?
SELECT Creator, SUM(CASE WHEN CAST(CreateDate AS DATE) > CAST(GETDATE() AS DATE) THEN TotalSC ELSE 0 END) AS Future, SUM(CASE WHEN CAST(CreateDate AS DATE) <= CAST(GETDATE() AS DATE) THEN TotalSC ELSE 0 END) AS Past FROM PO_Header GROUP BY Creator
רעיון מעולה!!! לא חשבתי להשתמש בזה.
תראה את תחילת הפרוצדורה ותבין כמה קוד חסכת לי (75%!!)
-- הצהרה על הטבלה המרכזית שאמורה להיות מוחזרת בסוף הפרוצדורה declare @table table (UserID int, DataType nvarchar(50), ThisDay float default 0,ThisWeek float default 0,ThisMonth float default 0,LastMonth float default 0, Comment nvarchar (500)); -- טבלת משתמשים אלו משתמשים יש להכניס לטבלה במידה ונבחר משתמש 0 יוכנסו כל המשתמשים שבתוכנה לטבלה declare @usersTable table (UserID int); insert into @usersTable select ContactID from Users where ContactID = @userID or @userID=0; -- טבלה שמרכזת את כל סוגי הנתונים שנרצה להכניס לטבלה declare @DataTypeTable table (DataType nvarchar(50)); insert into @DataTypeTable values('שעות עבודה'),('יצירת תיקים'),('ביקור בכרטיסים'), ('יצירת כרטיסים'),('שיחות טלפון'),('משימות לחזור ללקוחות'), ('המתנה למסמכים'),('העברה לבתיה'),('ימי עבודה'), ('הכנסות לפי פרודוקציה'),('סכום הגשה להחזר'),('יחס שעות תיקים'), ('יחס שעות הכנסות'); -- מכניס את כל סוגי הנתונים לטבלה עם היוזרים insert into @table (userID,DataType) select UserID, DataType from @usersTable, @DataTypeTable; -- ============================ שעות עבודה ============================ update @table set ThisDay = a.ThisDay , ThisWeek = a.ThisWeek, ThisMonth = a.ThisMonth, LastMonth = a.LastMonth from (select UserID, SUM(CASE WHEN dbo.Queries_GetDateWhere([StartTime],'ThisDay') = 1 THEN (datediff(SECOND,[StartTime],isnull([EndTime],getdate()))/60.0/60.0) ELSE 0 END) AS ThisDay, SUM(CASE WHEN dbo.Queries_GetDateWhere([StartTime],'ThisWeek') = 1 THEN (datediff(SECOND,[StartTime],isnull([EndTime],getdate()))/60.0/60.0) ELSE 0 END) AS ThisWeek, SUM(CASE WHEN dbo.Queries_GetDateWhere([StartTime],'ThisMonth') = 1 THEN (datediff(SECOND,[StartTime],isnull([EndTime],getdate()))/60.0/60.0) ELSE 0 END) AS ThisMonth, SUM(CASE WHEN dbo.Queries_GetDateWhere([StartTime],'LastMonth') = 1 THEN (datediff(SECOND,[StartTime],isnull([EndTime],getdate()))/60.0/60.0) ELSE 0 END) AS LastMonth from UsersWorkingHoursRepoet group by UserID) a inner join @table t on t.UserID= a.UserID where t.DataType='שעות עבודה';
כל הקוד הזה זה רק לשעות עבודה ועדיין נשארו לי ים שאילתות ל ('יצירת תיקים'),('ביקור בכרטיסים'),
('יצירת כרטיסים'),('שיחות טלפון'),('משימות לחזור ללקוחות'),
('המתנה למסמכים'),('העברה לבתיה'),('ימי עבודה'),
('הכנסות לפי פרודוקציה'),('סכום הגשה להחזר'),('יחס שעות תיקים'),
('יחס שעות הכנסות')פורסם במקור בפורום CODE613 ב27/10/2014 14:47 (+02:00)
-
הסתבכתי במקרה הבא כאשר מדובר בשאילתה מקוננת:
select count(*) ,s.UserID from (select distinct RowID,UserID from ScreenTimer where formName='Contacts') as s group by s.UserID
אני צריך לקבל מידע כמה כרטיסי לקוחות ייחודיים פתח היום העובד, לצורך כך לא די לי בטבלת screenTimer כי אפשר שיש שם כמה פעמים שנפתח כרטיס לקוח, אני צריך רשימה ייחודית של rowID ו UserID, אולם הפתרון הנ"ל לכאורה לא יהיה זמין כאשר אצטרך בסלקט הסופי לקבל את הקאונט לפי תנאים משתנים....
פורסם במקור בפורום CODE613 ב27/10/2014 15:25 (+02:00)
-
לא ממש ירדתי לסוף דעתך אבל ברפרוף נ"ל שהתחביר של Count+Distinct יעשה לך טוב
SELECT COUNT(DISTINCT EmailAddress), -- Count unique Emails COUNT(DISTINCT EmailAddress + ';' + CampaignID), -- Same with two columns COUNT(DISTINCT (CASE WHEN CampaignID = 68 THEN EmailAddress END)) -- Count unique Emails for specific campaign FROM BatchInfoView
פורסם במקור בפורום CODE613 ב28/10/2014 00:20 (+02:00)