باستخدام نتائج من استعلامات الوالدين في الاختيار المتداخل
-
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
كذلك، ولكن سيتم حساب كل شهر مرة واحدة فقط.