نتيجة مختلفة من SELECT ومن تحديد داخل طريقة العرض

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

  •  26-09-2019
  •  | 
  •  

سؤال

النتيجة من عبارة SELECT تختلف عن النتيجة من اختيار Inside View. كيفية إصلاح المشكلة والحصول على نفس النتيجة في الاعتبار؟

جدول الإجراءات:

+--+---------+--------------+-----------+------+
|id|person_id|action_type_id|currency_id|sum   |
+--+---------+--------------+-----------+------+
|1 |1        |1             |1          | 1.00 |
|2 |1        |1             |1          | 5.00 |
|3 |1        |1             |2          |10.00 | 
|4 |1        |2             |1          | 2.00 |
|5 |2        |1             |1          |20.00 |
|6 |2        |2             |2          | 5.00 |
+--+---------+--------------+-----------+------+

تحديد:

SELECT person_id AS p, currency_id AS c,
(
CAST(
COALESCE(
(SELECT SUM(sum) FROM actions WHERE action_type_id=1 AND person_id=p AND currency_id=c)
, 0)
AS DECIMAL(11,2)) -
CAST(
COALESCE(
(SELECT SUM(sum) FROM actions WHERE action_type_id=2 AND person_id=p AND currency_id=c)
, 0)
AS DECIMAL(11,2))
) AS sum
FROM actions
GROUP BY currency_id, person_id
ORDER BY person_id, currency_id;

نتيجة:

+--+--+------+
|p |c |sum   |
+--+--+------+
|1 |1 | 4.00 |
|1 |2 |10.00 |
|2 |1 |20.00 |
|2 |2 |-5.00 |
+--+--+------+

حدد داخل العرض:

CREATE VIEW p_sums AS
SELECT person_id AS p, currency_id AS c,
(
CAST(
COALESCE(
(SELECT SUM(sum) FROM actions WHERE action_type_id=1 AND person_id=p AND currency_id=c)
, 0)
AS DECIMAL(11,2)) -
CAST(
COALESCE(
(SELECT SUM(sum) FROM actions WHERE action_type_id=2 AND person_id=p AND currency_id=c)
, 0)
AS DECIMAL(11,2))
) AS sum
FROM actions
GROUP BY currency_id, person_id
ORDER BY person_id, currency_id;

SELECT * FROM p_sums;

نتيجة:

+--+--+------+
|p |c |sum   |
+--+--+------+
|1 |1 |29.00 |
|1 |2 |29.00 |
|2 |1 |29.00 |
|2 |2 |29.00 |
+--+--+------+
هل كانت مفيدة؟

المحلول

لا يمكنك أن تفعل:

SELECT person_id AS p, currency_id AS c, SUM(CASE action_Type_id WHEN 1 THEN sum WHEN 2 THEN -sum END) as sum
FROM actions
GROUP BY currency_id, person_id
ORDER BY person_id, currency_id;

أي التخلص من الفخات الفرعية ، وقم فقط ببناء مجموع واحد (جعل قيم Action_type_id 2 سلبية)

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