باستخدام نتائج من استعلامات الوالدين في الاختيار المتداخل

StackOverflow https://stackoverflow.com/questions/915401

  •  06-09-2019
  •  | 
  •  

سؤال

أنا متأكد من أن هذه مشكلة تافهة إلى حد ما، لكنني لست متأكدا من ما لإيجاد الحل.

لدي جدول يشبه هذا:

CREATE TABLE IF NOT EXISTS `transactions` (
  `name` text collate utf8_swedish_ci NOT NULL,
  `value` decimal(65,2) NOT NULL,
  `date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=COMPACT;

أضع هذا عن طريق قطع ولصق البيانات من الخدمة المصرفية عبر الإنترنت. يمكن أن تكون القيمة قيمة سلبية أو إيجابية، ما يجب أن يكون كل من التاريخ والاسم الواضح واضحا إلى حد ما؛) لقد قمت ببناء استعلام للسماح لي أن أرى خلاصة أسفل لكل شهر:

SELECT sum(`value`) as 'change', DATE_FORMAT(`date`, '%M %Y') as 'month'
FROM `transactions` 
WHERE 1
GROUP BY year(`date`), month(`date`)

الآن أود إضافة إجمالي الأموال المتراكمة في الحساب في نهاية الشهر كعمود إضافي.

SELECT sum(`value`) as 'change', DATE_FORMAT(`date`, '%M %Y') as 'month', 
(SELECT sum(`value`) FROM `transactions` WHERE `date` <= 123) as 'accumulated'
FROM `transactions` 
WHERE 1
GROUP BY year(`date`), month(`date`)

123 ليس بالضبط ما أريده هناك، لكنني لا أفهم كيفية الحصول على النتيجة من تاريخي Date_Format داخل تلك الاسمية الفرعية.

هل هذه هي الطريقة المناسبة للتعامل مع المشكلة؟

هذا هو في الغالب تمرين شخصي (يعمل على مجموعة صغيرة جدا) لذلك أنا لست قلقا للغاية بشأن الأداء، مقروءة SQL أكثر أهمية بكثير.

أقوم بتشغيل جدول InnoDB على MySQL 5.0.45

هل كانت مفيدة؟

المحلول

SELECT  change,
        CONCAT(mymonth, ' ', myyear) AS 'month',
        (
        SELECT  SUM(`value`)
        FROM    `transactions`
        WHERE   `date` < DATE_ADD(STR_TO_DATE(CONCAT('01.', mymonth, '.', myyear, '%D.%M.%Y'), INTERVAL 1 MONTH))
        )
FROM    (
        SELECT  sum(`value`) as 'change', YEAR(date) AS myyear, MONTH(date) AS mymonth
        FROM    `transactions` 
        WHERE 1
        GROUP BY 
                YEAR(`date`), MONTH(`date`)
        ) q

لقد كتبت أنك لا تعزز الأداء، ولكن هذا الجملة ليس أكثر تعقيدا ولكن سيكون أكثر كفاءة (فقط في حالة):

SELECT  SUM(value) AS change,
        CONCAT(MONTH(`date`), ' ', YEAR(`date`)) AS 'month',
        @r : = @r + SUM(value) AS cumulative
FROM    (
        SELECT  @r := 0
        ) AS vars,
        transactions
WHERE 1
GROUP BY 
        YEAR(`date`), MONTH(`date`)
ORDER BY
        YEAR(`date`), MONTH(`date`)

هذا واحد سوف يحسب التراكمي SUMكذلك، ولكن سيتم حساب كل شهر مرة واحدة فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top