繁体   English   中英

是否可以通过多个子查询和JOIN简化此SQL语句

[英]Is it possible to simplify this SQL statement with multiple subqueries and JOINs

我花了几天的时间来创建这个相当复杂的SQL语句,现在它正好满足了我的需求。 现在,我想知道是否有更好/更简单的方法来做到这一点。 MySQL也不会让我在此语句上创建视图

 SELECT name, a.user, liste, c.order, total_1kr, total_5kr, total_8kr, total_10kr, total_paid, differens, sbdato, spaid, sbreg, sfdato, sforbrug, sfreg
 FROM (SELECT t.user, t.paid AS spaid, t.dato AS sbdato, t.registrant AS sbreg FROM( 
    SELECT user,MAX(dato) AS maksdato
    FROM g_kiosk_f WHERE paid!=0
    GROUP BY user) AS x 
    JOIN g_kiosk_f AS t ON x.user =t.user
    AND x.maksdato = t.dato) AS a 
 JOIN (SELECT s.user, (s.1kr+(s.5kr)*5+(s.8kr)*8+(s.10kr)*10) AS sforbrug, s.dato AS sfdato, s.registrant AS sfreg FROM( 
    SELECT user,MAX(dato) AS maksdato
    FROM g_kiosk_f WHERE 1kr!=0 OR 5kr!=0 OR 8kr!=0 OR 10kr!=0
    GROUP BY user) AS y 
    JOIN g_kiosk_f AS s ON y.user=s.user
    AND y.maksdato=s.dato) AS b
 JOIN (SELECT t1.name, t2.user, t1.liste, t1.order, sum( t2.1kr ) AS total_1kr, sum( t2.5kr ) *5 AS total_5kr, sum( t2.8kr ) *8 AS total_8kr, sum( t2.10kr ) *10 AS total_10kr, sum( t2.paid ) AS total_paid, ( sum( t2.1kr ) + sum( t2.5kr ) *5 + sum( t2.8kr ) *8 + sum( t2.10kr ) *10 - sum( t2.paid )) AS differens
    FROM g_kiosk_users AS t1
    INNER JOIN g_kiosk_f AS t2 ON t1.nr = t2.user
    GROUP BY t2.user
    ORDER BY t1.name ASC) AS c
 ON a.user=b.user AND a.user=c.user

我有一个表'g_kiosk_f',其中包含ID(用户),日期(Dato),5种交易(1KR,5KR,8KR,10KR和已付款),收银员(注册人)。 另一个表“ g_kiosk_users”包含名称和ID(nr)。 我想要一个结果集显示

  1. 支付的日期,注册人和最新交易金额!= 0
  2. 日期,注册者和最新交易金额,其中1kr!= 0、5kr!= 0、8kr!= 0或10kr!= 0
  3. 总和(1kr + 5kr + 8kr + 10kr)和总和(已付)之差

所以结果应该看起来像

Name | id | difference | newest paid date | newest paid registrant | newest paid amount | newest kr date | newest kr registrant | newest kr amount |

在上面,我已经包括了手工进行差值计算所需的数字,因为在某些时候它是必需的,但是现在已经过时了。 有没有道理?

看起来应该可以像这样重写查询:

SELECT t1.name AS name, a.user AS user, t1.liste, t1.order,
       SUM(t2.1kr) AS total_1kr, SUM(t2.5kr) * 5 AS total_5kr,
       SUM(t2.8kr) AS total_8kr, SUM(t2.10kr) * 5 AS total_10kr,
       SUM(52.paid) AS total_paid,
       SUM(t2.1kr + 5 * tt.5kr + 8 * t2.8kr + 10 * t2.10kr)
       -SUM(t2.paid) AS differens
       a.dato AS sbdato, a.paid AS spaid, a.registrant as sbreg,
       b.dato as sfdato,
       (b.1kr+(b.5kr)*5+(b.8kr)*8+(b.10kr)*10) AS sforbrug,
       b.registrant AS sfreg
FROM g_kiosk_f AS a
INNER JOIN (SELECT user, MAX(dato) FROM g_kiosk_f
            WHERE paid != 0
            GROUP BY user) AS a2
ON a.user = a2.user AND a.dato = a2.dato
INNER JOIN g_kiosk_f as b  ON b.user = a.user
INNER JOIN (SELECT user, MAX(dato) FROM g_kiosk_f
            WHERE  1kr!=0 OR 5kr!=0 OR 8kr!=0 OR 10kr!=0
            GROUP BY user) AS b2
ON b.user = b2.user AND b.dato = b2.dato
INNER JOIN g_kiosk_f as t2 ON t2.user = a.user
INNER JOIN g_kiosk_users as t1 ON t1.nr = t2.user
GROUP BY a.user
ORDER BY name ASC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM