免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3943 | 回复: 5
打印 上一主题 下一主题

请教一个子查询之间的关系(和group by有关) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-28 20:36 |只看该作者 |倒序浏览
下面一个查询会报错ORA-00979: not a GROUP BY expression

SELECT T.TIME,
       T.CARRIER,
       T.CITYNAME,
       T.SCC_TERMINAL,
       NVL((SELECT NXSC.PRICE
             FROM XSCQUOTATION NXSC
            WHERE NXSC.CODE = T.CODE
              AND NXSC.FIELD1 = T.CITYNAME
              AND NXSC.CATENTRY_TYPE = 'terminal'),
           (SELECT NXSC.PRICE
              FROM XSCQUOTATION NXSC
             WHERE NXSC.CODE = T.CODE
               AND NXSC.FIELD1 = '省外'
               AND NXSC.CATENTRY_TYPE = 'terminal')) * T.SCC_TERMINAL SCC_TERMINAL_PRIICE
  FROM (SELECT TO_CHAR(ITEM.TIMESHIPPED, 'yyyy-mm') TIME,
               SHIPMODE.CODE,
               SHIPMODE.CARRIER,
               SUBSTR(XADDRESS.CITY, 1, 2) CITYNAME,
               SUM(CASE
                     WHEN RELEASE.STATUS = 'SSUC' AND
                          (ITEM.DESCRIPTION IN ('1', '3') OR
                          (ITEM.DESCRIPTION IN ('4') AND
                          S.FIELD1 NOT IN ('200', '755', '750', '754', '752'))) THEN
                      1
                     ELSE
                      0
                   END) SCC_TERMINAL,
               SUM(CASE
                     WHEN RELEASE.STATUS = 'SFAL' AND RELEASE.FIELD2 = '14' AND
                          (ITEM.DESCRIPTION IN ('1', '3') OR
                          (ITEM.DESCRIPTION IN ('4') AND
                          S.FIELD1 NOT IN ('200', '755', '750', '754', '752'))) THEN
                      1
                     ELSE
                      0
                   END) FAIL_TERMINAL,
               SUM(CASE
                     WHEN RELEASE.STATUS = 'SSUC' AND
                          (ITEM.DESCRIPTION IN ('21', '22') OR
                          (ITEM.DESCRIPTION IN ('12') AND
                          S.FIELD1 NOT IN ('755', '750', '754', '752'))) THEN
                      1
                     ELSE
                      0
                   END) SCC_CARD,
               SUM(CASE
                     WHEN RELEASE.STATUS = 'SFAL' AND RELEASE.FIELD2 = '14' AND
                          (ITEM.DESCRIPTION IN ('21', '22') OR
                          (ITEM.DESCRIPTION IN ('12') AND
                          S.FIELD1 NOT IN ('755', '750', '754', '752'))) THEN
                      1
                     ELSE
                      0
                   END) FAIL_CARD
          FROM XOMORDERITEMS ITEM
          LEFT JOIN XOMORDRELEASE RELEASE ON ITEM.ORDERS_ID =
                                             RELEASE.ORDERS_ID
                                         AND RELEASE.STATUS IN
                                             ('SSUC', 'SFAL')
          LEFT JOIN SHIPMODE SHIPMODE ON ITEM.SHIPMODE_ID =
                                         SHIPMODE.SHIPMODE_ID
          LEFT JOIN XOMADDRESS XADDRESS ON ITEM.ADDRESS_ID =
                                           XADDRESS.ADDRESS_ID
          LEFT JOIN STORE S ON S.STORE_ID = ITEM.STOREENT_ID
         WHERE ITEM.CATENTRY_ID = ITEM.FIELD1
           AND TO_CHAR(ITEM.TIMESHIPPED, 'yyyy-mm') IS NOT NULL
           AND SHIPMODE.CARRIER IS NOT NULL
           AND SUBSTR(XADDRESS.CITY, 1, 2) IS NOT NULL
           AND TO_CHAR(ITEM.TIMESHIPPED, 'yyyy-mm') = '2010-06'
         GROUP BY TO_CHAR(ITEM.TIMESHIPPED, 'yyyy-mm'),
                  SHIPMODE.CODE,
                  SHIPMODE.CARRIER,
                  SUBSTR(XADDRESS.CITY, 1, 2)) T
ORDER BY TO_DATE(T.TIME, 'yyyy-mm'), T.CODE;



我解释下这个查询的思路,他应该是在from后面的一个子查询(使用了group by)作为一个基础集合T, 再利用这个T的集合完成上面的主查询显示的值。

但是,由于主查询里面使用了一个nvl函数
       NVL((SELECT NXSC.PRICE
             FROM XSCQUOTATION NXSC
            WHERE NXSC.CODE = T.CODE
              AND NXSC.FIELD1 = T.CITYNAME
              AND NXSC.CATENTRY_TYPE = 'terminal'),
           (SELECT NXSC.PRICE
              FROM XSCQUOTATION NXSC
             WHERE NXSC.CODE = T.CODE
               AND NXSC.FIELD1 = '省外'
               AND NXSC.CATENTRY_TYPE = 'terminal')) * T.SCC_TERMINAL SCC_TERMINAL_PRIICE

来完成if的功能,里面有引用T的结果集进行where的过滤。

我的疑问是,为什么两个子查询会相互影响呢?
我做过下面的尝试:
1.把T做成一个视图,然后再替换掉这个复杂查询里面的T部分,仍是报错。
2.去掉主查询里面的nvl那个显示字段,可以成功。


请问是否这种思路来做这种if的目的是不可能了呢?我想了很久帮他改写都不成功。
恳请各位指点一下,谢谢。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-06-28 21:02 |只看该作者
写得太乱了。看不明白。不过最简单的,你的SUM,AVG等函数前面的字段都应该在GROUPBY里。

论坛徽章:
0
3 [报告]
发表于 2010-06-28 23:21 |只看该作者
写得太乱了。看不明白。不过最简单的,你的SUM,AVG等函数前面的字段都应该在GROUPBY里。
renxiao2003 发表于 2010-06-28 21:02



   
谢谢指点,我也尝试过把from后面的子查询的 T 那部分单独拿出来执行,是可以执行成功的。但就是合起来前面的nvl部分就不行了。

我也觉得这个问题是比较难描述,请问我应该补充哪部分的内容呢?我再详细点描述。谢谢。

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
4 [报告]
发表于 2010-07-01 15:48 |只看该作者
请贴出该语句所涉及的表结构创建语句,以便别人来帮你实验解决,不然大家光去看那上百字的sql语句,估计很多人都没有这个耐性吧

论坛徽章:
0
5 [报告]
发表于 2010-07-02 16:14 |只看该作者
请贴出该语句所涉及的表结构创建语句,以便别人来帮你实验解决,不然大家光去看那上百字的sql语句,估计很多 ...
duolanshizhe 发表于 2010-07-01 15:48



   

实在抱歉,我尝试用getddl来得到每个表的语句,和用desc得到表结构,我一贴到论坛上就会报
“对不起,您填写的内容(如签名、帖子、短消息等)包含不良内容而无法提交,请修改。”
不给我贴,我就用文本记录下来了,用附件上传。
恳请指点一下,谢谢。


ddl.rar (1.79 KB, 下载次数: 16)

论坛徽章:
0
6 [报告]
发表于 2010-07-03 16:18 |只看该作者
怎么不弄成sql文件压缩上传啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP