小白求教,关于group by的问题

乖喵咪 2017-11-15 09:03:55
select TD.OwnerName,TD.CltName,sum(TD.JHSL) JHSL,sum(TD.JHSL2) JHSL2,TD.JHRQ,sum(TD1.LineSumFC) LineSumFC
From ZZXSJH TM
LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry
LEFT JOIN SAOrdA TD1 on TD1.DocEntry
LEFT JOIN SAord TM1 ON TM1.DocEntry
Where TM1.DocDate>=TD.JHRQ
Group by TD.OwnerName,TD.JHRQ,TM1.CrdName,TD.CltName

如上,我需要在列上显示TD.OwnerName,TD.CltName,这两个字段,但是又不想它们参与运算,因为字段是文本类型,如果group by不带上它们,就又报错,应该肿么弄?
...全文
327 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
听雨停了 2017-11-15
  • 打赏
  • 举报
回复
引用 7 楼 sielsn 的回复:
ZZXSJHA就是ZZXSJH表,SAOrdA就是SAord表,最后一个表我现在要做的,就是将前两个表做一个对比,统计计划完成率。可以这样理解:第一个表是月实际销售情况(随时会变化),第二个表是月初计划销售目标(月初手动录入)。然后就是需要将这两个表对比,达到如第三个表那样的效果 [quote=引用 6 楼 qq_37170555 的回复:] [quote=引用 5 楼 sielsn 的回复:] 您好,我是想要达到如上图中的效果,表SAOrd是系统自动生成的,依时间增加,表ZZXSJH是月初维护好的,最终的表如果SAOrd有增加未维护计划的,则JHSL列显示为零。 [quote=引用 4 楼 qq_37170555 的回复:] [quote=引用 3 楼 sielsn 的回复:] 您看我这样写对吗?但是这样写却查不到任何数据。是不是格式有问题? select DISTINCT TD.OwnerName,TD.CltName,TD.JHSL,TD.JHSL2, Sum ((TD1.LineSumFC) OVER (PARTITION by TD.OwnerName)) LineSumFC From ZZXSJH TM LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry LEFT JOIN SAOrdA TD1 on TD1 LEFT JOIN SAOrd TM1 on TM1 Where TM1.DocDate>=TD.JHRQ [quote=引用 2 楼 qq_37170555 的回复:]

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
引用 2 楼 qq_37170555 的回复:

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
[/quote] PARTITION by是分组的意思,你都说了列上显示TD.OwnerName,TD.CltName但是又不想它们参与运算。你用这个去分组肯定有可能出不来数据啊。你就 PARTITION BY TD.JHRQ,TM1.CrdName啊[/quote][/quote] 你的意思是用上面两个表的数据生成下面这个表的数据?如果是没那么麻烦啊 如果不是你的sql中
select TD.OwnerName,TD.CltName,sum(TD.JHSL) JHSL,sum(TD.JHSL2) JHSL2,TD.JHRQ,sum(TD1.LineSumFC) LineSumFC
From ZZXSJH TM
LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry
LEFT JOIN SAOrdA TD1 on TD1.DocEntry
LEFT JOIN SAord TM1 ON TM1.DocEntry
Where TM1.DocDate>=TD.JHRQ
Group by TD.OwnerName,TD.JHRQ,TM1.CrdName,TD.CltName
ZZXSJHA表,SAOrdA表在你上面的图片中都没有啊,还有,最后两个表怎么都没有关联条件啊 [/quote][/quote] 那就直接用上面两个表连一下就可以啦,搞这么复杂干嘛啊
乖喵咪 2017-11-15
  • 打赏
  • 举报
回复
ZZXSJHA就是ZZXSJH表,SAOrdA就是SAord表,最后一个表我现在要做的,就是将前两个表做一个对比,统计计划完成率。可以这样理解:第一个表是月实际销售情况(随时会变化),第二个表是月初计划销售目标(月初手动录入)。然后就是需要将这两个表对比,达到如第三个表那样的效果
引用 6 楼 qq_37170555 的回复:
[quote=引用 5 楼 sielsn 的回复:] 您好,我是想要达到如上图中的效果,表SAOrd是系统自动生成的,依时间增加,表ZZXSJH是月初维护好的,最终的表如果SAOrd有增加未维护计划的,则JHSL列显示为零。 [quote=引用 4 楼 qq_37170555 的回复:] [quote=引用 3 楼 sielsn 的回复:] 您看我这样写对吗?但是这样写却查不到任何数据。是不是格式有问题? select DISTINCT TD.OwnerName,TD.CltName,TD.JHSL,TD.JHSL2, Sum ((TD1.LineSumFC) OVER (PARTITION by TD.OwnerName)) LineSumFC From ZZXSJH TM LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry LEFT JOIN SAOrdA TD1 on TD1 LEFT JOIN SAOrd TM1 on TM1 Where TM1.DocDate>=TD.JHRQ [quote=引用 2 楼 qq_37170555 的回复:]

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
引用 2 楼 qq_37170555 的回复:

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
[/quote] PARTITION by是分组的意思,你都说了列上显示TD.OwnerName,TD.CltName但是又不想它们参与运算。你用这个去分组肯定有可能出不来数据啊。你就 PARTITION BY TD.JHRQ,TM1.CrdName啊[/quote][/quote] 你的意思是用上面两个表的数据生成下面这个表的数据?如果是没那么麻烦啊 如果不是你的sql中
select TD.OwnerName,TD.CltName,sum(TD.JHSL) JHSL,sum(TD.JHSL2) JHSL2,TD.JHRQ,sum(TD1.LineSumFC) LineSumFC
From ZZXSJH TM
LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry
LEFT JOIN SAOrdA TD1 on TD1.DocEntry
LEFT JOIN SAord TM1 ON TM1.DocEntry
Where TM1.DocDate>=TD.JHRQ
Group by TD.OwnerName,TD.JHRQ,TM1.CrdName,TD.CltName
ZZXSJHA表,SAOrdA表在你上面的图片中都没有啊,还有,最后两个表怎么都没有关联条件啊 [/quote]
听雨停了 2017-11-15
  • 打赏
  • 举报
回复
引用 5 楼 sielsn 的回复:
您好,我是想要达到如上图中的效果,表SAOrd是系统自动生成的,依时间增加,表ZZXSJH是月初维护好的,最终的表如果SAOrd有增加未维护计划的,则JHSL列显示为零。 [quote=引用 4 楼 qq_37170555 的回复:] [quote=引用 3 楼 sielsn 的回复:] 您看我这样写对吗?但是这样写却查不到任何数据。是不是格式有问题? select DISTINCT TD.OwnerName,TD.CltName,TD.JHSL,TD.JHSL2, Sum ((TD1.LineSumFC) OVER (PARTITION by TD.OwnerName)) LineSumFC From ZZXSJH TM LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry LEFT JOIN SAOrdA TD1 on TD1 LEFT JOIN SAOrd TM1 on TM1 Where TM1.DocDate>=TD.JHRQ [quote=引用 2 楼 qq_37170555 的回复:]

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
引用 2 楼 qq_37170555 的回复:

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
[/quote] PARTITION by是分组的意思,你都说了列上显示TD.OwnerName,TD.CltName但是又不想它们参与运算。你用这个去分组肯定有可能出不来数据啊。你就 PARTITION BY TD.JHRQ,TM1.CrdName啊[/quote][/quote] 你的意思是用上面两个表的数据生成下面这个表的数据?如果是没那么麻烦啊 如果不是你的sql中
select TD.OwnerName,TD.CltName,sum(TD.JHSL) JHSL,sum(TD.JHSL2) JHSL2,TD.JHRQ,sum(TD1.LineSumFC) LineSumFC
From ZZXSJH TM
LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry
LEFT JOIN SAOrdA TD1 on TD1.DocEntry
LEFT JOIN SAord TM1 ON TM1.DocEntry
Where TM1.DocDate>=TD.JHRQ
Group by TD.OwnerName,TD.JHRQ,TM1.CrdName,TD.CltName
ZZXSJHA表,SAOrdA表在你上面的图片中都没有啊,还有,最后两个表怎么都没有关联条件啊
乖喵咪 2017-11-15
  • 打赏
  • 举报
回复

您好,我是想要达到如上图中的效果,表SAOrd是系统自动生成的,依时间增加,表ZZXSJH是月初维护好的,最终的表如果SAOrd有增加未维护计划的,则JHSL列显示为零。
引用 4 楼 qq_37170555 的回复:
[quote=引用 3 楼 sielsn 的回复:]
您看我这样写对吗?但是这样写却查不到任何数据。是不是格式有问题?
select DISTINCT TD.OwnerName,TD.CltName,TD.JHSL,TD.JHSL2,
Sum ((TD1.LineSumFC) OVER (PARTITION by TD.OwnerName)) LineSumFC



From ZZXSJH TM
LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry
LEFT JOIN SAOrdA TD1 on TD1
LEFT JOIN SAOrd TM1 on TM1
Where TM1.DocDate>=TD.JHRQ

[quote=引用 2 楼 qq_37170555 的回复:]

SELECT DISTINCT TD.OwnerName,
TD.CltName,
SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
TD.JHRQ,
SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM ZZXSJH TM
LEFT JOIN ZZXSJHA TD
ON TD.DocEntry = TM.DocEntry
LEFT JOIN SAOrdA TD1
ON TD1.DocEntry
LEFT JOIN SAord TM1
ON TM1.DocEntry
WHERE TM1.DocDate >= TD.JHRQ

用over(partition by )


引用 2 楼 qq_37170555 的回复:

SELECT DISTINCT TD.OwnerName,
TD.CltName,
SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
TD.JHRQ,
SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM ZZXSJH TM
LEFT JOIN ZZXSJHA TD
ON TD.DocEntry = TM.DocEntry
LEFT JOIN SAOrdA TD1
ON TD1.DocEntry
LEFT JOIN SAord TM1
ON TM1.DocEntry
WHERE TM1.DocDate >= TD.JHRQ

用over(partition by )
[/quote]
PARTITION by是分组的意思,你都说了列上显示TD.OwnerName,TD.CltName但是又不想它们参与运算。你用这个去分组肯定有可能出不来数据啊。你就 PARTITION BY TD.JHRQ,TM1.CrdName啊[/quote]
听雨停了 2017-11-15
  • 打赏
  • 举报
回复
引用 3 楼 sielsn 的回复:
您看我这样写对吗?但是这样写却查不到任何数据。是不是格式有问题? select DISTINCT TD.OwnerName,TD.CltName,TD.JHSL,TD.JHSL2, Sum ((TD1.LineSumFC) OVER (PARTITION by TD.OwnerName)) LineSumFC From ZZXSJH TM LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry LEFT JOIN SAOrdA TD1 on TD1 LEFT JOIN SAOrd TM1 on TM1 Where TM1.DocDate>=TD.JHRQ [quote=引用 2 楼 qq_37170555 的回复:]

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
引用 2 楼 qq_37170555 的回复:

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
[/quote] PARTITION by是分组的意思,你都说了列上显示TD.OwnerName,TD.CltName但是又不想它们参与运算。你用这个去分组肯定有可能出不来数据啊。你就 PARTITION BY TD.JHRQ,TM1.CrdName啊
乖喵咪 2017-11-15
  • 打赏
  • 举报
回复
您看我这样写对吗?但是这样写却查不到任何数据。是不是格式有问题? select DISTINCT TD.OwnerName,TD.CltName,TD.JHSL,TD.JHSL2, Sum ((TD1.LineSumFC) OVER (PARTITION by TD.OwnerName)) LineSumFC From ZZXSJH TM LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry LEFT JOIN SAOrdA TD1 on TD1 LEFT JOIN SAOrd TM1 on TM1 Where TM1.DocDate>=TD.JHRQ
引用 2 楼 qq_37170555 的回复:

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
引用 2 楼 qq_37170555 的回复:

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
听雨停了 2017-11-15
  • 打赏
  • 举报
回复

SELECT DISTINCT TD.OwnerName,
       TD.CltName,
       SUM(TD.JHSL) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL,
       SUM(TD.JHSL2) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) JHSL2,
       TD.JHRQ,
       SUM(TD1.LineSumFC) OVER(PARTITION BY TD.JHRQ,TM1.CrdName) LineSumFC
FROM   ZZXSJH TM
       LEFT JOIN ZZXSJHA TD
            ON  TD.DocEntry = TM.DocEntry
       LEFT JOIN SAOrdA TD1
            ON  TD1.DocEntry
       LEFT JOIN SAord TM1
            ON  TM1.DocEntry
WHERE  TM1.DocDate >= TD.JHRQ
用over(partition by )
顺势而为1 2017-11-15
  • 打赏
  • 举报
回复
加上max


select max(TD.OwnerName),max(TD.CltName),sum(TD.JHSL) JHSL,sum(TD.JHSL2) JHSL2,TD.JHRQ,sum(TD1.LineSumFC) LineSumFC
From ZZXSJH TM
LEFT JOIN ZZXSJHA TD on TD.DocEntry=TM.DocEntry
LEFT JOIN SAOrdA TD1 on TD1.DocEntry
LEFT JOIN SAord TM1 ON TM1.DocEntry
Where TM1.DocDate>=TD.JHRQ
Group by TD.JHRQ,TM1.CrdName


590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧