none
הפיכת משתנים בטבלה לשמות טורים RRS feed

  • שאלה

  • יש לי לצורך העניין שני טבלאות: שמות מוצרים, הזמנות.

    בטבלה הראשונה: ID ושמות המוצרים באנגלית

    בטבלה השנייה: שם המזמין, ID מוצר, וכמות מוצרים

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

    לדו':

    טבלה 1:

    NANEpro    IDpro

     pro1     324324         

     pro2     322344     

     pro3     384955     

    טבלה סופית:

    name      pro1      pro2       pro3

       dan         3          4         6

       dani                     6         9

    אשמח לכל עזרה,

    תודה ושנה טובה

    יום רביעי 01 אוקטובר 2014 07:12

תשובות

  • מדובר בפעולה פשוטה של PIVOT. אני אשים לך את הפתרון אבל אני מאוד מאוד מאוד ממליץ לגגשת קודם למדריך טוב וללמוד מה זה PIVOT ןכן UNPIVOT וכיצד עובדים איתם.

    1. בשלב הראשון עלינו לקבל את כל הנתונים ולכן אנו נעזר ב JOIN פשוט

    	-- First we nned to get all the information from all tables
    	-- For this we use JOIN operation
    	select 
    		--I.IDpro, -- we dont need this in the final result
    		I.NAMEpro, U.NAMEuser, U.SUMpro
    	from @TBLproId I
    	left join @TBLproUser U on I.IDpro = U.IDpro

    שים לב שאני לא צריך את הנתון של IDpro בתוצאה הסופית והוא רק משמש לצורך ביצוע החיבור בין הנתונים בטבלאות. בדוק את התוצאו של השאילתה הו בנפרד ותוודא שאתה מבין אותה לעומק לפני שאתה ממשיך!

    עתה מגיע החלק הפשוט של ה PIVOT ולכן הקוד שלנו יראה כך

    DECLARE @TBLproId TABLE(IDpro INT, NAMEpro VARCHAR(20))
    INSERT INTO @TBLproId
    SELECT 3432,'pro1' UNION ALL
    SELECT 2312,'pro2' UNION ALL   
    SELECT 1234,'pro3'
    DECLARE @TBLproUser TABLE( NAMEuser VARCHAR(20),IDpro INT,SUMpro INT)
    INSERT INTO @TBLproUser
    SELECT 'dan',3432,4 UNION ALL
    SELECT 'dan',2312,3 UNION ALL   
    SELECT 'dan',1234,6 UNION ALL
    SELECT 'sun',3432,23 UNION ALL
    SELECT 'sun',2312,25 UNION ALL   
    SELECT 'sun',1234,20
    
    --SELECT * FROM @TBLproId
    --SELECT * FROM @TBLproUser
    
    select * 
    from (
    	-- First we nned to get all the information from all tables
    	-- For this we use JOIN operation
    	select 
    		--I.IDpro, -- we dont need this in the final result
    		I.NAMEpro, U.NAMEuser, U.SUMpro
    	from @TBLproId I
    	left join @TBLproUser U on I.IDpro = U.IDpro
    ) T
    pivot (
    	MAX(SUMpro) 
    	for NAMEpro in (pro1,pro2,pro3)
    ) P
    

    אני מקווה שזה עונה על הצרכים שלך :-)

    ואני חוזר על ההמלצה ללמוד על נושא ה PIVOT ועל UNPIVOT לעומק! אלו כלים מאוד יעילים.


    [Personal Site]  [Blog]  [Facebook]
    signature

    • סומן כתשובה על-ידי עופרס יום רביעי 01 אוקטובר 2014 14:17
    יום רביעי 01 אוקטובר 2014 09:42
    מנחה דיון
  • 1. זה כבר שאלה אחרת :-) למרות שהיא דומה והפתרון יהיה מבוסס על הפתרון שרשמתי מעל.

    לכן אחרי שתלמד כיצד עובדים עם PIVOT, תעבור לחלק הבא שנקרא Dynamic PIVOT

    2. חפש בגוגל ותמצא הרבה מאוד מאמרים על dynamic pivot :-) זו מילת המפתח לפתרון שאתה צריך.
    בדרך תלמד לעומק על הנושא של Dynamic Query לפני שאתה מתחיל עם הדוגמה של Dynamic Pivot!

    זה מסלול הלימוד הנכון :-)
    קודם תלמד מה זה שאיתה דינאמית ואז תלמד כיצד מיישמים את הרעיון על PIVOT. מכיוון ש dynamic Pivot זה שאילתה קצת מורכבת לכתוב מההתחלה (לא קשה, זה בדיוק כמו PIVOT אבל הקוד נכתב דינאמית, אבל בגלל כל הסימונים זה קצת מורכב. מורכב לא שווה קשה).

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


    [Personal Site]  [Blog]  [Facebook]
    signature

    • סומן כתשובה על-ידי עופרס יום רביעי 01 אוקטובר 2014 14:17
    יום רביעי 01 אוקטובר 2014 11:24
    מנחה דיון

כל התגובות

  • בוקר טוב,

    אנא צרף DDL+DML כדי לחסוך לנו זמן מיותר.
    http://ariely.info/Blog/tabid/83/EntryId/70/Data-Definition-Language-DDL-and-Data-Manipulation-Language-DML.aspx


    [Personal Site]  [Blog]  [Facebook]
    signature

    יום רביעי 01 אוקטובר 2014 07:27
    מנחה דיון
  • עמכם הסליחה.
    טבלה 1 של המוצרים, וטבלה מספר 2 של ההזמנות

    DECLARE @TBLproId TABLE(IDpro INT, NAMEpro VARCHAR(20))

    INSERT INTO @TBLproId

    SELECT 3432,'pro1' UNION ALL

    SELECT 2312,'pro2' UNION ALL   

    SELECT 1234,'pro3'

    DECLARE @TBLproUser TABLE( NAMEuser VARCHAR(20),IDpro INT,SUMpro INT)

    INSERT INTO @TBLproUser

    SELECT 'dan',3432,4 UNION ALL

    SELECT 'dan',2312,3 UNION ALL   

    SELECT 'dan',1234,6 UNION ALL

    SELECT 'sun',3432,23 UNION ALL

    SELECT 'sun',2312,25 UNION ALL   

    SELECT 'sun',1234,20


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

    יום רביעי 01 אוקטובר 2014 07:58
  • מדובר בפעולה פשוטה של PIVOT. אני אשים לך את הפתרון אבל אני מאוד מאוד מאוד ממליץ לגגשת קודם למדריך טוב וללמוד מה זה PIVOT ןכן UNPIVOT וכיצד עובדים איתם.

    1. בשלב הראשון עלינו לקבל את כל הנתונים ולכן אנו נעזר ב JOIN פשוט

    	-- First we nned to get all the information from all tables
    	-- For this we use JOIN operation
    	select 
    		--I.IDpro, -- we dont need this in the final result
    		I.NAMEpro, U.NAMEuser, U.SUMpro
    	from @TBLproId I
    	left join @TBLproUser U on I.IDpro = U.IDpro

    שים לב שאני לא צריך את הנתון של IDpro בתוצאה הסופית והוא רק משמש לצורך ביצוע החיבור בין הנתונים בטבלאות. בדוק את התוצאו של השאילתה הו בנפרד ותוודא שאתה מבין אותה לעומק לפני שאתה ממשיך!

    עתה מגיע החלק הפשוט של ה PIVOT ולכן הקוד שלנו יראה כך

    DECLARE @TBLproId TABLE(IDpro INT, NAMEpro VARCHAR(20))
    INSERT INTO @TBLproId
    SELECT 3432,'pro1' UNION ALL
    SELECT 2312,'pro2' UNION ALL   
    SELECT 1234,'pro3'
    DECLARE @TBLproUser TABLE( NAMEuser VARCHAR(20),IDpro INT,SUMpro INT)
    INSERT INTO @TBLproUser
    SELECT 'dan',3432,4 UNION ALL
    SELECT 'dan',2312,3 UNION ALL   
    SELECT 'dan',1234,6 UNION ALL
    SELECT 'sun',3432,23 UNION ALL
    SELECT 'sun',2312,25 UNION ALL   
    SELECT 'sun',1234,20
    
    --SELECT * FROM @TBLproId
    --SELECT * FROM @TBLproUser
    
    select * 
    from (
    	-- First we nned to get all the information from all tables
    	-- For this we use JOIN operation
    	select 
    		--I.IDpro, -- we dont need this in the final result
    		I.NAMEpro, U.NAMEuser, U.SUMpro
    	from @TBLproId I
    	left join @TBLproUser U on I.IDpro = U.IDpro
    ) T
    pivot (
    	MAX(SUMpro) 
    	for NAMEpro in (pro1,pro2,pro3)
    ) P
    

    אני מקווה שזה עונה על הצרכים שלך :-)

    ואני חוזר על ההמלצה ללמוד על נושא ה PIVOT ועל UNPIVOT לעומק! אלו כלים מאוד יעילים.


    [Personal Site]  [Blog]  [Facebook]
    signature

    • סומן כתשובה על-ידי עופרס יום רביעי 01 אוקטובר 2014 14:17
    יום רביעי 01 אוקטובר 2014 09:42
    מנחה דיון
  • עופר, אני רואה את ההודעה שמחקת, ואני מבין מכך שקראת את התגובה שלי מעל.

    אנא סגור את השרשור על ידי סימון התשובות והצבעה על הודעות מועילות בשרשור (להצביע אפשר גם בשרשורים אחרים שלא אתה פתחת, אבל לסגור את השרשור על ידי סימון התשובה רק שואל השאלה צריך לבצע).


    [Personal Site]  [Blog]  [Facebook]
    signature

    יום רביעי 01 אוקטובר 2014 10:50
    מנחה דיון
  • תודה רבה רונן על ההשקעה והתשובה,

    אבל גם הפתרון שלי שמחקתי, וגם הפתרון שלך (אם הבנתי אותו נכון) מתבסס על ידיעת מהן העמודות (pro1 pro2),

    אבל אם אינני יודע כמה עמודות ישנן, או אפילו 100 מוצרים בטבלה, כיצד אני מגדיר את טבלת הPIVOT, ואת השמות של הטורים.

    תודה

    יום רביעי 01 אוקטובר 2014 11:15
  • 1. זה כבר שאלה אחרת :-) למרות שהיא דומה והפתרון יהיה מבוסס על הפתרון שרשמתי מעל.

    לכן אחרי שתלמד כיצד עובדים עם PIVOT, תעבור לחלק הבא שנקרא Dynamic PIVOT

    2. חפש בגוגל ותמצא הרבה מאוד מאמרים על dynamic pivot :-) זו מילת המפתח לפתרון שאתה צריך.
    בדרך תלמד לעומק על הנושא של Dynamic Query לפני שאתה מתחיל עם הדוגמה של Dynamic Pivot!

    זה מסלול הלימוד הנכון :-)
    קודם תלמד מה זה שאיתה דינאמית ואז תלמד כיצד מיישמים את הרעיון על PIVOT. מכיוון ש dynamic Pivot זה שאילתה קצת מורכבת לכתוב מההתחלה (לא קשה, זה בדיוק כמו PIVOT אבל הקוד נכתב דינאמית, אבל בגלל כל הסימונים זה קצת מורכב. מורכב לא שווה קשה).

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


    [Personal Site]  [Blog]  [Facebook]
    signature

    • סומן כתשובה על-ידי עופרס יום רביעי 01 אוקטובר 2014 14:17
    יום רביעי 01 אוקטובר 2014 11:24
    מנחה דיון