sql sever (כותרת זמנית: אם הייתי יודע לנסח את הכותרת בתמצות הייתי כנראה מוצא תשובות מועילות בגוגל...)
-
sql sever
יש לי view שנותן מפרט וסטטוס
העמודה 'סטטוס' לא מכילה ערך אמיתי מטבלה
אלא עמודה שמחזירה תוצאה בודדת של סטטוס נוכחי באמצעות CASE WHENאני מעוניין לקבל סיכום של כמה הזמנות יש לי כרגע בכל סטטוס
את המידע הזה אני שולף בפשטות באמצעות COUNT / GROUP BY על העמודה 'סטטוס'אממה
אני מקבל רק את הסיכום של הסטטוסים המופיעים הקיימים ברגע זהבעוד שאני מעוניין לקבל תוצאה של כל האפשריות בסטטוסים,
ובמידה ואין הזמנה תואמת שיופיע בכמות 0 (כעת השורה לא מופיעה כלל)דוגמא:
(אני מעוניין לקבל גם את התוצאה של 'צפון' = 0)CREATE TABLE Table_test ( FirstName varchar(255), LastName varchar(255), City varchar(255) ); INSERT INTO Table_test ([FirstName], [LastName], [City]) VALUES ('חיים', 'כהן', 'ירושלים'), ('שלמה', 'פרידמן', 'ירושלים'), ('יעקב', 'שמואלי', 'בני ברק'), ('יצחק', 'אבינו', 'נתיבות'), ('אלימלך', 'צוקרמן', 'נתיבות') ; select COUNT(v_view.t_status) as 'namber' ,v_view.t_status as 'status' from ( select tt.FirstName ,tt.LastName ,tt.City ,CASE WHEN tt.City = 'ירושלים' THEN 'מרכז' WHEN tt.City = 'בני ברק' THEN 'גוש דן' WHEN tt.City = 'נתיבות' THEN 'דרום' WHEN tt.City = 'רכסים' THEN 'צפון' ELSE '' END as t_status from Table_test tt ) v_view GROUP BY t_status
-
@mekev הכי פשוט זה לייחד טבלה לסטטוסים,
זה גם הדרך הנכונה וההגיונית, כי אם הסטטוסים הם רשימה שרירותית שבכל מקרה אתה רוצה לראות,
מקומה של כזו רשימה היא טבלה ולא שאילתה!
בטבלה אתה עושה עמודת סטטוס ועמודת עיר ומתקיים שמה קשר רבים רבים,
ובשאילתה אתה מחבר בRIGHT JOIN ביניהם ואז אתה תמיד מקבל שורת סטטוס גם אם אין בה כלום. -
@mekev
אגב, אתה יכול לפשט קצת את השאילתה שלך:SELECT COUNT(City) Number, CASE WHEN City = 'ירושלים' THEN 'מרכז' WHEN City = 'בני ברק' THEN 'גוש דן' WHEN City = 'נתיבות' THEN 'דרום' WHEN City = 'רכסים' THEN 'צפון' END Status FROM Table_test GROUP BY status
-
@dovid כתב בsql sever (כותרת זמנית: אם הייתי יודע לנסח את הכותרת בתמצות הייתי כנראה מוצא תשובות מועילות בגוגל...):
כי אם הסטטוסים הם רשימה שרירותית שבכל מקרה אתה רוצה לראות,
מקומה של כזו רשימה היא טבלה ולא שאילתה!
בטבלה אתה עושה עמודת סטטוס ועמודת עיר ומתקיים שמה קשר רבים רבים,
ובשאילתה אתה מחבר בRIGHT JOIN ביניהם ואז אתה תמיד מקבל שורת סטטוס גם אם אין בה כלוםזהו,
שהסטטוסים זה רשימה שרירותית ידוע מראש
אבל התנאים ב CASE WHEN זה מניפולציות על המידע, ולא ערך שניתן להצלבה(דוגמא: מעבדת מחשבים המשווקת מחשבים ושרתים הבנויים בהתאמה אישית
אני מעוניין לדעת מה סטטוס ההזמנה
בתנאי CASE WHEN יש לי משהו בסגנון:
אם עמודת תאריך התקנת המעבד null - הסטטוס: ממתין למעבד
אם עמודת תאריך התקנת הלוח אם null - הסטטוס: ממתין ללוח אם
אם עמודת תאריך קבלת המארז null - הסטטוס: ממתין למארז
וכו וכו' )[הדוגמא הנוכחית באה להמחיש את מקור התנאי, ולא שאכן באמת ניתן להכריז על הסטטוס של הכנת מחשב לפי הנ"ל
במקרה האמיתי, מדובר על סביבת יצור עם סדר תהליכים קבוע, כך שאני יודע בבירור שלא ניתן להקדים שלב לפני השני] -
@mekev אז עליך להשאיר את הCASE על מכונו, ועם זאת לחבר לו RIGHT JOIN לטבלת סטטוסים.
משהו כזה:select SUM(IIF(tt.City IS NULL, 0, 1)) as number ,Table_Status.[Name] ,CASE WHEN tt.City = 'ירושלים' THEN 'מרכז' WHEN tt.City = 'בני ברק' THEN 'גוש דן' WHEN tt.City = 'נתיבות' THEN 'דרום' WHEN tt.City = 'רכסים' THEN 'צפון' ELSE '' END as t_status from Table_test tt RIGHT JOIN Table_Status ON t_status = Table_Status.[Name] GROUP BY Table_Status.[Name]