এসক - sql এর মূল তিনটি ক্লোজ কি



একটি এসকিউএল স্টেটমেন্ট সহ শতাংশ গণনা কিভাবে (8)

  1. সবচেয়ে কার্যকর (উপর ব্যবহার করে) ()।

    select Grade, count(*) * 100.0 / sum(count(*)) over()
    from MyTable
    group by Grade
  2. ইউনিভার্সাল (কোন এসকিউএল সংস্করণ)।

    select Rate, count(*) * 100.0 / (select count(*) from MyTable)
    from MyTable
    group by Rate;
  3. CTE, কম দক্ষতার সাথে।

    with t(Rate, RateCount) 
    as 
    ( 
        select Rate, count(*) 
        from MyTable
        group by Rate
    )
    select Rate, RateCount * 100.0/(select sum(RateCount) from t)
    from t;

আমার একটি SQL সার্ভার টেবিল রয়েছে যার মধ্যে ব্যবহারকারী এবং তাদের গ্রেড রয়েছে। সাদৃশ্যের জন্য, ঠিক আছে বলুন 2 টি কলাম - name এবং grade । সুতরাং একটি সাধারণ সারি নাম হবে: "জন ডো", গ্রেড: "এ"।

আমি একটি এসকিউএল স্টেটমেন্ট খুঁজছি যা সমস্ত সম্ভাব্য উত্তরগুলির শতাংশ পাবে। (এ, বি, সি, ইত্যাদি ...) এছাড়াও, সব সম্ভাব্য উত্তরগুলি সংজ্ঞায়িত না করে এটি করার উপায় আছে (খোলা পাঠ্য ক্ষেত্র - ব্যবহারকারীরা 'পাস / ব্যর্থ', 'কেউ', ইত্যাদি লিখতে পারে না ...)

আমি যে ফাইনাল আউটপুট খুঁজছেন তা হল A: 5%, B: 15%, C: 40%, ইত্যাদি ...


আপনাকে গ্রেডের মোট হিসাব করতে হবে যদি এটি SQL 2005 হয় তবে আপনি CTE ব্যবহার করতে পারেন

    WITH Tot(Total) (
    SELECT COUNT(*) FROM table
    )
    SELECT Grade, COUNT(*) / Total * 100
--, CONVERT(VARCHAR, COUNT(*) / Total * 100) + '%'  -- With percentage sign
--, CONVERT(VARCHAR, ROUND(COUNT(*) / Total * 100, -2)) + '%'  -- With Round
    FROM table
    GROUP BY Grade

আপনি গ্রেড ক্ষেত্রে গ্রুপ করতে হবে। এই প্রশ্নের উত্তর আপনার অনেকটা কোন ডাটাবেসের জন্য খুঁজছেন কি দিতে হবে।

    Select Grade, CountofGrade / sum(CountofGrade) *100 
    from
    (
    Select Grade, Count(*) as CountofGrade
    From Grades
    Group By Grade) as sub
    Group by Grade

আপনি ব্যবহার করছেন সিস্টেম উল্লেখ করা উচিত।


আমি কখনই এই শতাংশ ব্যবহার করবো যখন আমাকে শতকরা কাজ করতে হবে ..

ROUND(CAST((Numerator * 100.0 / Denominator) AS FLOAT), 2) AS Percentage

দ্রষ্টব্য যে 100.0 দশমিক ফেরত দেয়, আর 100 এর নিজস্ব ফলাফলগুলি ঘনিষ্ঠভাবে পূর্ণ সংখ্যাটি এমনকি ROUND () ফাংশনের সাথেও পূর্ণ করবে!


এটি, আমি বিশ্বাস করি, একটি সাধারণ সমাধান, যদিও আমি এটি আইবিএম ইনফর্মিক্স ডায়নামিক সার্ভার 11.50.FC3 ব্যবহার করে পরীক্ষা করেছি। নিচের প্রশ্নঃ

SELECT grade,
       ROUND(100.0 * grade_sum / (SELECT COUNT(*) FROM grades), 2) AS pct_of_grades
    FROM (SELECT grade, COUNT(*) AS grade_sum
            FROM grades
            GROUP BY grade
         )
    ORDER BY grade;

অনুভূমিক নিয়ম নীচে দেখানো পরীক্ষার তথ্য নিম্নলিখিত আউটপুট দেয়। ROUND ফাংশন DBMS- নির্দিষ্ট হতে পারে, কিন্তু বাকি (সম্ভবত) হয় না। (নোট করুন যে আমি 100 থেকে 100.0 পরিবর্তন করেছি তা নিশ্চিত করার জন্য, অ-পূর্ণসংখ্যা ব্যবহার করে গণনা ঘটেছে - DECIMAL, NUMERIC - গাণিতিক; মন্তব্য দেখুন এবং থান্ডারকে ধন্যবাদ।)

grade  pct_of_grades
CHAR(1) DECIMAL(32,2)
A       32.26
B       16.13
C       12.90
D       12.90
E       9.68
F       16.13
CREATE TABLE grades
(
    id VARCHAR(10) NOT NULL,
    grade CHAR(1) NOT NULL CHECK (grade MATCHES '[ABCDEF]')
);

INSERT INTO grades VALUES('1001', 'A');
INSERT INTO grades VALUES('1002', 'B');
INSERT INTO grades VALUES('1003', 'F');
INSERT INTO grades VALUES('1004', 'C');
INSERT INTO grades VALUES('1005', 'D');
INSERT INTO grades VALUES('1006', 'A');
INSERT INTO grades VALUES('1007', 'F');
INSERT INTO grades VALUES('1008', 'C');
INSERT INTO grades VALUES('1009', 'A');
INSERT INTO grades VALUES('1010', 'E');
INSERT INTO grades VALUES('1001', 'A');
INSERT INTO grades VALUES('1012', 'F');
INSERT INTO grades VALUES('1013', 'D');
INSERT INTO grades VALUES('1014', 'B');
INSERT INTO grades VALUES('1015', 'E');
INSERT INTO grades VALUES('1016', 'A');
INSERT INTO grades VALUES('1017', 'F');
INSERT INTO grades VALUES('1018', 'B');
INSERT INTO grades VALUES('1019', 'C');
INSERT INTO grades VALUES('1020', 'A');
INSERT INTO grades VALUES('1021', 'A');
INSERT INTO grades VALUES('1022', 'E');
INSERT INTO grades VALUES('1023', 'D');
INSERT INTO grades VALUES('1024', 'B');
INSERT INTO grades VALUES('1025', 'A');
INSERT INTO grades VALUES('1026', 'A');
INSERT INTO grades VALUES('1027', 'D');
INSERT INTO grades VALUES('1028', 'B');
INSERT INTO grades VALUES('1029', 'A');
INSERT INTO grades VALUES('1030', 'C');
INSERT INTO grades VALUES('1031', 'F');

নিম্নলিখিত কাজ করা উচিত

ID - Key
Grade - A,B,C,D...

সম্পাদন করুন: * 100 সরানো হয়েছে এবং এটি সংখ্যার বিভাগটি না করে তা 1.0 যোগ করেছে

Select 
   Grade, Count(ID) * 100.0 / ((Select Count(ID) From MyTable) * 1.0)
From MyTable
Group By Grade

যেকোন এসকিউএল সার্ভারের সংস্করণে আপনি সমস্ত শ্রেণীর মোটের জন্য একটি পরিবর্তনশীল ব্যবহার করতে পারেন:

declare @countOfAll decimal(18, 4)
select @countOfAll = COUNT(*) from Grades

select
Grade,  COUNT(*) / @countOfAll * 100
from Grades
group by Grade

SELECT Grade, GradeCount / SUM(GradeCount)
FROM (SELECT Grade, COUNT(*) As GradeCount
      FROM myTable
      GROUP BY Grade) Grades





tsql