SQL查询UNION ALL,LEFT JOIN ON

----统计不同部门,不同时间发送短信量(注:没条短信内容大于70字算两条短信,短信状态-3(发送成功)短信状态-3 ----(发送成功)短信状态-4(接收成功))、 短信状态-4(接收失败) ----这是为了统计总共花费的钱数

SELECT E.*, NVL(F.COUNT_5, 0) AS COUNT_5
  FROM (SELECT C.*, NVL(D.COUNT_4, 0) AS COUNT_4
          FROM (select A.ORG_NO, A.COUNT, B.COUNT_3
                  from ((SELECT ORG_NO, SUM(COUNT_NUM) AS COUNT
                           FROM (SELECT T.ORG_NO, COUNT(*) AS COUNT_NUM
                                   FROM SMS_MESSAGE T
                                  WHERE T.SMS_STATE IN ('3', '4', '5')
                                    AND T.ORG_NO = '1357'
                                    AND LENGTH(T.CONTENT) > 0
                                    AND LENGTH(T.CONTENT) <= 70
                                    AND T.SENDTIME > '2010-03-26'
                                    AND T.SENDTIME <= '2012-04-26'
                                  GROUP BY T.ORG_NO
                                 UNION ALL
                                 SELECT T.ORG_NO, COUNT(*) * 2 AS COUNT_NUM
                                   FROM SMS_MESSAGE T
                                  WHERE T.SMS_STATE IN ('3', '4', '5')
                                    AND T.ORG_NO = '1357'
                                    AND LENGTH(T.CONTENT) > 70
                                    AND LENGTH(T.CONTENT) <= 140
                                    AND T.SENDTIME > '2010-03-26'
                                    AND T.SENDTIME <= '2012-04-26'
                                  GROUP BY T.ORG_NO
                                 UNION ALL
                                 SELECT T.ORG_NO, COUNT(*) * 3 AS COUNT_NUM
                                   FROM SMS_MESSAGE T
                                  WHERE T.SMS_STATE IN ('3', '4', '5')
                                    AND T.ORG_NO = '1357'
                                    AND LENGTH(T.CONTENT) > 140
                                    AND LENGTH(T.CONTENT) <= 210
                                    AND T.SENDTIME > '2010-03-26'
                                    AND T.SENDTIME <= '2012-04-26'
                                  GROUP BY T.ORG_NO
                                 UNION ALL
                                 SELECT T.ORG_NO, COUNT(*) * 4 AS COUNT_NUM
                                   FROM SMS_MESSAGE T
                                  WHERE T.SMS_STATE IN ('3', '4', '5')
                                    AND T.ORG_NO = '1357'
                                    AND LENGTH(T.CONTENT) > 210
                                    AND LENGTH(T.CONTENT) <= 280
                                    AND T.SENDTIME > '2010-03-26'
                                    AND T.SENDTIME <= '2012-04-26'
                                  GROUP BY T.ORG_NO)
                          GROUP BY ORG_NO
                          ORDER BY ORG_NO) A LEFT JOIN
                        (SELECT ORG_NO, SUM(COUNT_NUM) AS COUNT_3
                           FROM (SELECT T.ORG_NO, COUNT(*) AS COUNT_NUM
                                   FROM SMS_MESSAGE T
                                  WHERE T.SMS_STATE = '3'
                                    AND T.ORG_NO = '1357'
                                    AND LENGTH(T.CONTENT) > 0
                                    AND LENGTH(T.CONTENT) <= 70
                                    AND T.SENDTIME > '2010-03-26'
                                    AND T.SENDTIME <= '2012-04-26'
                                  GROUP BY T.ORG_NO
                                 UNION ALL
                                 SELECT T.ORG_NO, COUNT(*) * 2 AS COUNT_NUM
                                   FROM SMS_MESSAGE T
                                  WHERE T.SMS_STATE = '3'
                                    AND T.ORG_NO = '1357'
                                    AND LENGTH(T.CONTENT) > 70
                                    AND LENGTH(T.CONTENT) <= 140
                                    AND T.SENDTIME > '2010-03-26'
                                    AND T.SENDTIME <= '2012-04-26'
                                  GROUP BY T.ORG_NO
                                 UNION ALL
                                 SELECT T.ORG_NO, COUNT(*) * 3 AS COUNT_NUM
                                   FROM SMS_MESSAGE T
                                  WHERE T.SMS_STATE = '3'
                                    AND T.ORG_NO = '1357'
                                    AND LENGTH(T.CONTENT) > 140
                                    AND LENGTH(T.CONTENT) <= 210
                                    AND T.SENDTIME > '2010-03-26'
                                    AND T.SENDTIME <= '2012-04-26'
                                  GROUP BY T.ORG_NO
                                 UNION ALL
                                 SELECT T.ORG_NO, COUNT(*) * 4 AS COUNT_NUM
                                   FROM SMS_MESSAGE T
                                  WHERE T.SMS_STATE = '3'
                                    AND T.ORG_NO = '1357'
                                    AND LENGTH(T.CONTENT) > 210
                                    AND LENGTH(T.CONTENT) <= 280
                                    AND T.SENDTIME > '2010-03-26'
                                    AND T.SENDTIME <= '2012-04-26'
                                  GROUP BY T.ORG_NO)
                          GROUP BY ORG_NO
                          ORDER BY ORG_NO) B ON A.ORG_NO = B.ORG_NO)) C
          LEFT JOIN (SELECT ORG_NO, SUM(COUNT_NUM) AS COUNT_4
                      FROM (SELECT T.ORG_NO, COUNT(*) AS COUNT_NUM
                              FROM SMS_MESSAGE T
                             WHERE T.SMS_STATE = '4'
                               AND T.ORG_NO = '1357'
                               AND LENGTH(T.CONTENT) > 0
                               AND LENGTH(T.CONTENT) <= 70
                               AND T.SENDTIME > '2010-03-26'
                               AND T.SENDTIME <= '2012-04-26'
                             GROUP BY T.ORG_NO
                            UNION ALL
                            SELECT T.ORG_NO, COUNT(*) * 2 AS COUNT_NUM
                              FROM SMS_MESSAGE T
                             WHERE T.SMS_STATE = '4'
                               AND T.ORG_NO = '1357'
                               AND LENGTH(T.CONTENT) > 70
                               AND LENGTH(T.CONTENT) <= 140
                               AND T.SENDTIME > '2010-03-26'
                               AND T.SENDTIME <= '2012-04-26'
                             GROUP BY T.ORG_NO
                            UNION ALL
                            SELECT T.ORG_NO, COUNT(*) * 3 AS COUNT_NUM
                              FROM SMS_MESSAGE T
                             WHERE T.SMS_STATE = '4'
                               AND T.ORG_NO = '1357'
                               AND LENGTH(T.CONTENT) > 140
                               AND LENGTH(T.CONTENT) <= 210
                               AND T.SENDTIME > '2010-03-26'
                               AND T.SENDTIME <= '2012-04-26'
                             GROUP BY T.ORG_NO
                            UNION ALL
                            SELECT T.ORG_NO, COUNT(*) * 4 AS COUNT_NUM
                              FROM SMS_MESSAGE T
                             WHERE T.SMS_STATE = '4'
                               AND T.ORG_NO = '1357'
                               AND LENGTH(T.CONTENT) > 210
                               AND LENGTH(T.CONTENT) <= 280
                               AND T.SENDTIME > '2010-03-26'
                               AND T.SENDTIME <= '2012-04-26'
                             GROUP BY T.ORG_NO)
                     GROUP BY ORG_NO
                     ORDER BY ORG_NO) D ON C.ORG_NO = D.ORG_NO) E
  LEFT JOIN (SELECT ORG_NO, SUM(COUNT_NUM) AS COUNT_5
               FROM (SELECT T.ORG_NO, COUNT(*) AS COUNT_NUM
                       FROM SMS_MESSAGE T
                      WHERE T.SMS_STATE = '5'
                        AND T.ORG_NO = '1357'
                        AND LENGTH(T.CONTENT) > 0
                        AND LENGTH(T.CONTENT) <= 70
                        AND T.SENDTIME > '2010-03-26'
                        AND T.SENDTIME <= '2012-04-26'
                      GROUP BY T.ORG_NO
                     UNION ALL
                     SELECT T.ORG_NO, COUNT(*) * 2 AS COUNT_NUM
                       FROM SMS_MESSAGE T
                      WHERE T.SMS_STATE = '5'
                        AND T.ORG_NO = '1357'
                        AND LENGTH(T.CONTENT) > 70
                        AND LENGTH(T.CONTENT) <= 140
                        AND T.SENDTIME > '2010-03-26'
                        AND T.SENDTIME <= '2012-04-26'
                      GROUP BY T.ORG_NO
                     UNION ALL
                     SELECT T.ORG_NO, COUNT(*) * 3 AS COUNT_NUM
                       FROM SMS_MESSAGE T
                      WHERE T.SMS_STATE = '5'
                        AND T.ORG_NO = '1357'
                        AND LENGTH(T.CONTENT) > 140
                        AND LENGTH(T.CONTENT) <= 210
                        AND T.SENDTIME > '2010-03-26'
                        AND T.SENDTIME <= '2012-04-26'
                      GROUP BY T.ORG_NO
                     UNION ALL
                     SELECT T.ORG_NO, COUNT(*) * 4 AS COUNT_NUM
                       FROM SMS_MESSAGE T
                      WHERE T.SMS_STATE = '5'
                        AND T.ORG_NO = '1357'
                        AND LENGTH(T.CONTENT) > 210
                        AND LENGTH(T.CONTENT) <= 280
                        AND T.SENDTIME > '2010-03-26'
                        AND T.SENDTIME <= '2012-04-26'
                      GROUP BY T.ORG_NO)
              GROUP BY ORG_NO
              ORDER BY ORG_NO) F ON E.ORG_NO = F.ORG_NO
              

猜你喜欢

转载自zyssnh.iteye.com/blog/1498012
今日推荐