none
אחוזים RRS feed

  • שאלה

  • שלום לכולם,

    אני מבקש את עזרתכם בתרגול כלשהו שביצעתי

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

    maker model type
    A 1232 PC
    A 1233 PC
    A 1276 Printer
    A 1298 Laptop
    A 1401 Printer
    A 1408 Printer
    A 1752 Laptop
    B 1121 PC
    B 1750 Laptop
    C 1321 Laptop
    D 1288 Printer
    D 1433 Printer
    E 1260 PC
    E 1434 Printer
    E 2112 PC
    E 2113 PC

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

    השאילתא שניסיתי להפעיל היא:

    select maker, type,precentage1=(select maker,count(type)
         from product
         group by maker, type)/
         (select maker,count(type)
         from product
         group by maker)
    from product

    אל תתייחסו כרגע לDATA TYPE אותו אשנה כפי הצורך. הבעיה העקרונית שלי היא כיצד לבצע עמודה מחושבת כאשר במונה יש COUNT עם GROUP BY של שני עמודות ואילו במכנה COUNT עם GROUP BY של עמודה אחת

    תודה! 


    יום ראשון 04 נובמבר 2012 09:11

תשובות

  • הייתי עושה זאת מעט אחרת (מבלי להפחית ממה שעשית):

    declare @tempTable table 
        (
            maker nvarchar(5),
            model nvarchar(7),
            typeof nvarchar(7)
        )
    INSERT INTO @tempTable (maker
    					  , model
    					  , typeof)
    SELECT 'A'
    	 , '1232'
    	 , 'PC'
    UNION ALL
    SELECT 'A'
    	 , '1233'
    	 , 'PC'
    UNION ALL
    SELECT 'A'
    	 , '1276'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1298'
    	 , 'Laptop'
    UNION ALL
    SELECT 'A'
    	 , '1401'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1408'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1752'
    	 , 'Laptop'
    UNION ALL
    SELECT 'B'
    	 , '1121'
    	 , 'PC'
    UNION ALL
    SELECT 'B'
    	 , '1750'
    	 , 'Laptop'
    UNION ALL
    SELECT 'B'
    	 , '1321'
    	 , 'Laptop'
    UNION ALL
    SELECT 'C'
    	 , '1321'
    	 , 'Laptop'
    UNION ALL
    SELECT 'D'
    	 , '1288'
    	 , 'Printer'
    UNION ALL
    SELECT 'D'
    	 , '1433'
    	 , 'Printer'
    UNION ALL
    SELECT 'E'
    	 , '1260'
    	 , 'PC'
    UNION ALL
    SELECT 'E'
    	 , '1434'
    	 , 'Printer'
    UNION ALL
    SELECT 'E'
    	 , '2112'
    	 , 'PC'
    UNION ALL
    SELECT 'E'
    	 , '2113'
    	 , 'PC'
    
    Select	Maker,
    		TypeOf,
    		Cast(Count(*) As Float)/Sum(Count(*)) Over(Partition By Maker) Prcnt
    From	@tempTable
    Group By Maker,
    		TypeOf;


    El castellano no es mi lengua materna. Discúlpenme por los errores gramaticales, y, si pueden, corríjanme en los comentarios, o por correo electrónico. ¡Muchas gracias! Blog: http://about.me/GeriReshef

    • הוצע כתשובה על-ידי pituachMVP, Editor יום שלישי 06 נובמבר 2012 08:44
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 06 נובמבר 2012 13:58
    יום ראשון 04 נובמבר 2012 16:58

כל התגובות

  • declare @tempTable table 
        (
            maker nvarchar(5),
            model nvarchar(7),
            typeof nvarchar(7)
        )
    INSERT INTO @tempTable (maker
    					  , model
    					  , typeof)
    SELECT 'A'
    	 , '1232'
    	 , 'PC'
    UNION ALL
    SELECT 'A'
    	 , '1233'
    	 , 'PC'
    UNION ALL
    SELECT 'A'
    	 , '1276'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1298'
    	 , 'Laptop'
    UNION ALL
    SELECT 'A'
    	 , '1401'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1408'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1752'
    	 , 'Laptop'
    UNION ALL
    SELECT 'B'
    	 , '1121'
    	 , 'PC'
    UNION ALL
    SELECT 'B'
    	 , '1750'
    	 , 'Laptop'
    UNION ALL
    SELECT 'B'
    	 , '1321'
    	 , 'Laptop'
    UNION ALL
    SELECT 'C'
    	 , '1321'
    	 , 'Laptop'
    
    
    UNION ALL
    SELECT 'D'
    	 , '1288'
    	 , 'Printer'
    UNION ALL
    SELECT 'D'
    	 , '1433'
    	 , 'Printer'
    UNION ALL
    SELECT 'E'
    	 , '1260'
    	 , 'PC'
    UNION ALL
    SELECT 'E'
    	 , '1434'
    	 , 'Printer'
    UNION ALL
    SELECT 'E'
    	 , '2112'
    	 , 'PC'
    UNION ALL
    SELECT 'E'
    	 , '2113'
    	 , 'PC'
    
    
    	 select count (a.model),a.maker,a.typeof,b.modelcount,100/b.modelcount*count (a.model)
    from @tempTable a
    inner JOIN 
    (SELECT count(model)as modelcount,maker  FROM @tempTable  group by maker) b 
    ON b.maker = a.maker
    GROUP BY a.maker,a.typeof,b.modelcount

    • הוצע כתשובה על-ידי Ivan Radchenko יום ראשון 04 נובמבר 2012 13:55
    יום ראשון 04 נובמבר 2012 12:03
  • הייתי עושה זאת מעט אחרת (מבלי להפחית ממה שעשית):

    declare @tempTable table 
        (
            maker nvarchar(5),
            model nvarchar(7),
            typeof nvarchar(7)
        )
    INSERT INTO @tempTable (maker
    					  , model
    					  , typeof)
    SELECT 'A'
    	 , '1232'
    	 , 'PC'
    UNION ALL
    SELECT 'A'
    	 , '1233'
    	 , 'PC'
    UNION ALL
    SELECT 'A'
    	 , '1276'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1298'
    	 , 'Laptop'
    UNION ALL
    SELECT 'A'
    	 , '1401'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1408'
    	 , 'Printer'
    UNION ALL
    SELECT 'A'
    	 , '1752'
    	 , 'Laptop'
    UNION ALL
    SELECT 'B'
    	 , '1121'
    	 , 'PC'
    UNION ALL
    SELECT 'B'
    	 , '1750'
    	 , 'Laptop'
    UNION ALL
    SELECT 'B'
    	 , '1321'
    	 , 'Laptop'
    UNION ALL
    SELECT 'C'
    	 , '1321'
    	 , 'Laptop'
    UNION ALL
    SELECT 'D'
    	 , '1288'
    	 , 'Printer'
    UNION ALL
    SELECT 'D'
    	 , '1433'
    	 , 'Printer'
    UNION ALL
    SELECT 'E'
    	 , '1260'
    	 , 'PC'
    UNION ALL
    SELECT 'E'
    	 , '1434'
    	 , 'Printer'
    UNION ALL
    SELECT 'E'
    	 , '2112'
    	 , 'PC'
    UNION ALL
    SELECT 'E'
    	 , '2113'
    	 , 'PC'
    
    Select	Maker,
    		TypeOf,
    		Cast(Count(*) As Float)/Sum(Count(*)) Over(Partition By Maker) Prcnt
    From	@tempTable
    Group By Maker,
    		TypeOf;


    El castellano no es mi lengua materna. Discúlpenme por los errores gramaticales, y, si pueden, corríjanme en los comentarios, o por correo electrónico. ¡Muchas gracias! Blog: http://about.me/GeriReshef

    • הוצע כתשובה על-ידי pituachMVP, Editor יום שלישי 06 נובמבר 2012 08:44
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 06 נובמבר 2012 13:58
    יום ראשון 04 נובמבר 2012 16:58
  • בהחלט פתרון עדיף ניסתי בהתחלה עם OVER אבל לא הצלחתי לגלות את ה סינטקסט אז בסוף הלכתי על INNERJOIN
    יום שני 05 נובמבר 2012 15:08