MySQL में सभी पंक्तियों के लिए गणना(*) का योग




database rdbms (8)

जहाँ मैं group by साथ सभी पंक्तियों में count(*) मान चाहता हूँ, मैं sum() क्वेरी के साथ अटका हुआ हूँ।

यहाँ प्रश्न है:

select
    u.user_type as user,
    u.count,
    sum(u.count)
FROM
(
select 
    DISTINCT
    user_type,
    count(*) as count
FROM
    users
where
    (user_type = "driver" OR user_type = "passenger")
GROUP BY
    user_type
) u;

मौजूदा उत्पादन:

----------------------------------
|  user     |  count     |  sum  |
----------------------------------
| driver    | 58         |  90   |
----------------------------------

अपेक्षित उत्पादन:

----------------------------------
|  user     |  count     |  sum  |
----------------------------------
| driver    | 58         |  90   |
| passenger | 32         |  90   |
----------------------------------

यदि मैं क्वेरी से sum(u.count) तो आउटपुट ऐसा दिखता है:

--------------------------
|  user     |  count     |
--------------------------
| driver    | 58         |
| passenger | 32         |
--------------------------

इसे इस्तेमाल करे। इनलाइन देखने से कुल योग मिलता है:

SELECT a.user_type, 
       count(*) AS count,
       b.sum  
FROM   users a
JOIN (SELECT COUNT(*) as sum 
      FROM users 
      WHERE user_type IN ("driver","passenger" )
     ) b ON TRUE
WHERE  a.user_type IN ("driver","passenger" ) 
GROUP  BY a.user_type;

इसे इस्तेमाल करे:

WITH SUB_Q AS (
  SELECT USER_TYPE, COUNT (*) AS CNT
  FROM USERS
  WHERE USER_TYPE = "passenger" OR USER_TYPE = "driver"
  GROUP BY USER_TYPE
), 
SUB_Q2 AS (
  SELECT SUM(CNT) AS SUM_OF_COUNT
  FROM SUB_Q
)
SELECT A.USER_TYPE, A.CNT AS COUNT, SUB_Q2 AS SUM
FROM SUB_Q JOIN SUB_Q2 ON (TRUE);

मैंने पोस्टग्रैस्कल बोली का उपयोग किया लेकिन आप आसानी से एक सबक्वेरी में बदल सकते हैं।


user-type लिए अंत में खंड group by एक group by जोड़ें, जैसे:

select
    u.user_type as user,
    u.count,
    sum(u.count)
FROM
(
select 
    DISTINCT
    user_type,
    count(*) as count
FROM
    users
where
    (user_type = "driver" OR user_type = "passenger")
GROUP BY
    user_type
) u GROUP BY u.user_type;

select
    u.user_type as user,
    u.count,
    sum(u.count)
FROM users group by user

टॉम मैक स्पष्ट रूप से आपका उत्तर बताएं। यहाँ एक और तरीका है जो आप कर सकते हैं। मैं क्वेरी प्रदर्शन की जांच करता हूं और 1000 रिकॉर्ड के भीतर कोई अंतर नहीं पाया गया है

   select user_type,Countuser,(SELECT COUNT(*) 
   FROM users 
   WHERE user_type IN ('driver','passenger ') )as sum from (
   select user_type,count(*) as Countuser from users a
   where a.user_type='driver'
   group by a.user_type
   union
   select user_type,count(*) as Countuser from users b
   where b.user_type='passenger'
   group by b.user_type
   )c
   group by user_type,Countuser

आप WITH ROLLUP संशोधक के WITH ROLLUP उपयोग कर सकते हैं:

select coalesce(user_type, 'total') as user, count(*) as count
from users
where user_type in ('driver', 'passenger')
group by user_type with rollup

यह वही जानकारी लौटाएगा लेकिन एक अलग प्रारूप में:

user      | count
----------|------
driver    |    32
passenger |    58
total     |    90

db-fiddle

MySQL 8 में आप विंडो फ़ंक्शन के रूप में COUNT() उपयोग कर सकते हैं:

select distinct
  user_type,
  count(*) over (partition by user_type) as count,
  count(*) over () as sum
from users
where user_type in ('driver', 'passenger');

परिणाम:

user_type | count | sum
----------|-------|----
driver    |    32 |  90
passenger |    58 |  90

db-fiddle

या CTE (सामान्य टेबल एक्सप्रेशन) का उपयोग करें :

with cte as (
  select user_type, count(*) as count
  from users
  where user_type in ('driver', 'passenger')
  group by user_type
)
select user_type, count, (select sum(count) from cte) as sum
from cte

db-fiddle


आप बस SUM() OVER() को COUNT(*) साथ जोड़ सकते हैं:

SELECT user_type, COUNT(*) AS cnt, SUM(COUNT(*)) OVER() AS total
FROM  users WHERE user_type IN ('driver', 'passenger') GROUP BY user_type;

db <> फिडेल डेमो

आउटपुट:

+------------+------+-------+
| user_type  | cnt  | total |
+------------+------+-------+
| passenger  |  58  |    90 |
| driver     |  32  |    90 |
+------------+------+-------+

मैं पूछने के लिए परीक्षा होगी; क्या आप सुनिश्चित हैं कि आपको DB स्तर पर इसकी आवश्यकता है?

जब तक आप डेटाबेस परत में पूरी तरह से काम नहीं कर रहे हैं, तब तक इन परिणामों के किसी भी प्रसंस्करण को एक आवेदन परत में बनाया जाएगा और संभवतः परिणाम के माध्यम से लूपिंग के कुछ रूप की आवश्यकता होगी

यह चलाने में आसान, सरल और अधिक पठनीय हो सकता है

  SELECT user_type,
         COUNT(*) AS count
    FROM users
   WHERE user_type IN ("driver", "passenger")
GROUP BY user_type

.. और बस आवेदन परत में कुल गिनती जोड़ें

जैसा कि जुआन ने एक अन्य उत्तर में कहा, DISTINCT, निरर्थक है क्योंकि ग्रुप बाय यह सुनिश्चित करता है कि प्रत्येक परिणामी पंक्ति अलग-अलग हो।

जैसे कि मैं इसे और अधिक पठनीय पाता हूं, जुआन की तरह, मैं OR की बजाय यहां एक IN को प्राथमिकता देता हूं। यह भविष्य में आगे और स्थितियों के संयोजन से भ्रम की संभावना को भी कम करता है

एक तरफ के रूप में, मैं उपयोगकर्ता के प्रकार, "ड्राइवर" और "यात्री" के नामों को एक अलग user_types तालिका में स्थानांतरित करने पर विचार करूंगा और उन्हें आपके उपयोगकर्ता तालिका से आईडी कॉलम द्वारा संदर्भित करूंगा।

NB यदि आपको DB स्तर पर इसकी आवश्यकता है, तो मैं पॉल के उत्कृष्ट विकल्पों में से एक का उपयोग करने की वकालत करूंगा, या CROSS JOIN दृष्टिकोण टॉम मैक द्वारा, और जुआन द्वारा उनके दूसरे सुझाए गए समाधान के रूप में।





rdbms