使用嵌套的GROUP BY选择TOP(10)

时间:2017-06-15 13:57:40

标签: sql tsql

我的查询工作正常并提供结果

SELECT PartyName, Risk, SUM(CAST(Amount AS DECIMAL)) SubTotal
FROM CustomerData
GROUP BY PartyName, Risk

结果数据:

PartyName   Risk    SubTotal    

A           High    100
B           Med     25
A           Low     30
A           Med     70
B           Low     10

现在我想SUM每个派对的总数并查看前10名。我遇到了两个问题:

1。关于SUM的TOP(10)

如果我执行以下操作:

SELECT TOP(10) PartyName, SUM(SubTotal) Total
FROM 
    (SELECT PartyName, Risk, SUM(CAST(Amount AS DECIMAL)) SubTotal
    FROM CustomerData
    GROUP BY PartyName, Risk) AS S
GROUP BY PartyName

我最终获得了前10个而不是10个最高金额

2。错误:

  

专栏' S.Risk'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

当我尝试以下操作时:

SELECT TOP(10) PartyName, Risk, SUM(SubTotal) Total
FROM 
    (SELECT PartyName, Risk, SUM(CAST(Amount AS DECIMAL)) SubTotal
    FROM CustomerData
    GROUP BY PartyName, Risk) AS S
GROUP BY PartyName

我需要的是

PartyName   Risk    SubTotal    Total   

A           High    100         200
B           Med     25          35
A           Low     30          200
A           Med     70          200
B           Low     10          30

3 个答案:

答案 0 :(得分:3)

问题1:

如果您想要“最高10个小计”,则需要ORDER BY

SELECT TOP(10) PartyName, SUM(SubTotal) Total
FROM 
    (SELECT PartyName, Risk, SUM(CAST(Amount AS DECIMAL)) SubTotal
    FROM CustomerData
    GROUP BY PartyName, Risk) AS S
GROUP BY PartyName
ORDER BY Total DESC

问题2:

这有点棘手,因为在GROUP BY求和时你希望PartyName同时RiskSubTotal,但你也想要SubTotal求和} PartyName每个Total没有卷起来。

执行此操作的一种方法是将表格加入另一个几乎相同的表格,但第二个表格将选择每个派对的Risk (完全忽略ON PartyName ),这样我们就可以获得分组总数。

然后我们可以将其与我们的初始查询Total合并,以获得一个返回汇总数据的查询,以及每Party重复SELECT TOP(10) s.PartyName, s.Risk, s.SubTotal, s2.Total FROM (SELECT PartyName, Risk, SUM(CAST(Amount AS DECIMAL)) SubTotal FROM CustomerData GROUP BY PartyName, Risk) S LEFT JOIN (SELECT PartyName, SUM(CAST(Amount AS DECIMAL)) Total FROM CustomerData GROUP BY PartyName) S2 ON S.PartyName = S2.Partyname

import cv2
import numpy as np

template = cv2.imread('scratch_test.png',0)
w, h = template.shape[::-1]
video_capture = cv2.VideoCapture(0)

while True:
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    if gray.shape[0]>template.shape[0] and gray.shape[1]>template.shape[1]:
        res = cv2.matchTemplate(gray,template,cv2.TM_CCOEFF_NORMED)
        threshold = 0.8
        loc = np.where( res >= threshold)
        for pt in zip(*loc[::-1]):
            cv2.rectangle(frame, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
        cv2.imshow('orginal', frame)
        if cv2.waitKey(30) & 0xFF == ord('q'):
            break
    else:
        print "Error : Template and image size are: ", template.shape, gray.shape

答案 1 :(得分:0)

如果外部查询需要Risk,则底部为GROUP BY。

SELECT TOP(10) PartyName, Risk, SUM(SubTotal) Total
FROM 
    (SELECT PartyName, Risk, SUM(CAST(Amount AS DECIMAL)) SubTotal
    FROM CustomerData
    GROUP BY PartyName, Risk) AS S
GROUP BY PartyName, Risk

OR

SELECT TOP 10 * FROM 
(   SELECT PartyName, Risk, SUM(SubTotal) Total
   FROM 
       (SELECT PartyName, Risk, SUM(CAST(Amount AS DECIMAL))           SubTotal
       FROM CustomerData
       GROUP BY PartyName, Risk) AS S
   GROUP BY PartyName, Risk
)
ORDER BY Total DESC

答案 2 :(得分:0)

在您使用的第一个声明中,使用TOP(10),最后添加:ORDER BY Total DESC。多数民众赞成!:

SELECT TOP(10) PartyName, SUM(SubTotal) Total 
FROM (SELECT PartyName, Risk, SUM(CAST(Amount AS DECIMAL)) SubTotal 
      FROM CustomerData GROUP BY PartyName, Risk) AS S 
GROUP BY PartyName
ORDER BY Total DESC