SQL选择总和的最大值

时间:2018-03-27 05:03:28

标签: sql greatest-n-per-group snowflake-datawarehouse

我是论坛和SQL的新手,非常感谢所有的信息。我找不到一个对我有用的解决方案,所以我想在这里给出一个镜头。在雪花中经营。我的数据集看起来像这样(为麻烦的格式化道歉):

PO  | DIV | PROD |  QTY |   CUST
123 | 1  | x |  10 |    Sonic
234 |   1 | x   | 9 |   Sonic
345 | 1 |   x | 8   | McD
456 | 1 | x | 10    | Wendy's

我想通过DIV,PROD和CUST来总结数量。一旦我得到了这些总计数量,我想通过DIV和PROD获取最大的SUM(QTY),但保留CUST字段。因此,上面的答案看起来像这样:

1 | x | 19| Sonic

请注意,我显然拥有一个更大的数据库,因此我将列出所有唯一的产品/部门组合,其中列出了max(sum()),大约600K行。

我在这里的代码让我得到了总和(QTY)的点,但现在我需要在保留CUST字段的同时拉出最大总和(QTY)的行。你能帮我吗?我发现了一些关于每组最大的信息,但不确定这是我应该使用的以及如何

SELECT DIV, PROD, CUST, SUM(QTY) as QTY
from table
GROUP BY 
    DIV,
    PROD,
    CUST
Order by 
    DIV,
    PROD

编辑: 周杰伦的CTE方法对我有用,但我忘了提到我想创建一个表格。 CREATE或REPLACE TABLE不适用于CTE。使用CTE方法或不同方法创建表的任何方法?

谢谢!

4 个答案:

答案 0 :(得分:2)

<强> MYSQL

SELECT `DIV`, PROD, CUST,QTY from 
(
SELECT `DIV`, PROD, CUST, SUM(QTY) as QTY from 
table1 
GROUP BY `DIV`, PROD, CUST Order by `DIV`, PROD
) AS T
WHERE QTY=(SELECT MAX(QTY) FROM (SELECT `DIV`, PROD, CUST, SUM(QTY) as QTY from 
table1 
GROUP BY `DIV`, PROD, CUST Order by `DIV`, PROD) AS T)

OR

SELECT `DIV`, PROD, CUST,QTY from 
(
SELECT `DIV`, PROD, CUST, SUM(QTY) as QTY from 
table1 
GROUP BY `DIV`, PROD, CUST Order by `DIV`, PROD
) AS T ORDER BY QTY DESC LIMIT 1;

现场演示

  

http://sqlfiddle.com/#!9/f945c2b/19

SQL SERVER

使用CTE

WITH CTE AS
(
 SELECT DIV, PROD, CUST, SUM(QTY) as QTY,
 DENSE_RANK() OVER (PARTITION BY DIV, PROD ORDER BY SUM(QTY) DESC) AS Rank
 FROM 
 table1 
 GROUP BY DIV, PROD, CUST
)
SELECT DIV, PROD, CUST,QTY FROM CTE
WHERE Rank=1
ORDER BY DIV, PROD

使用嵌套查询

SELECT DIV, 
       PROD, 
       CUST,
       QTY 
FROM ( 
      SELECT DIV, PROD, CUST, SUM(QTY) as QTY, 
      DENSE_RANK() OVER (PARTITION BY DIV, PROD ORDER BY SUM(QTY) DESC) AS Rank
      FROM table1 
      GROUP BY DIV, PROD, CUST )AS T1 
 WHERE Rank=1 ORDER BY DIV, PROD;

现场演示

  

http://sqlfiddle.com/#!18/22001/11

答案 1 :(得分:0)

您可以通过sum(qty)子句

过滤汇总having
select 
       DIV, PROD, CUST, SUM(QTY) as QTY 
from table
group by DIV, PROD, CUST
having sum(QTY) = ( select max(QTY) from (
                    select sum(QTY) as QTY from table
                    group by DIV, PROD, CUST)a)

答案 2 :(得分:0)

在MySQL中试试这个:

SELECT A.`DIV`, A.PROD, IF(A.`DIV`=0,'NAN',A.AGG_QTY/A.`DIV`) QTY, A.CUST
FROM (SELECT `DIV`, PROD, CUST, SUM(QTY) AGG_QTY
      FROM `TABLE` 
      GROUP BY `DIV`, PROD, CUST
      ORDER BY SUM(QTY) DESC
      LIMIT 1) A;

SQL Fiddle

上查看它

答案 3 :(得分:-1)

private void button2_Click(object sender, EventArgs e)
{
    string selectQuery = "SELECT `username`, `password` FROM `users` WHERE `username` = '"+ username.Text + "' AND `password` = '" + password.Text +"';";
    MySqlDataAdapter adapter = new MySqlDataAdapter(selectQuery, DBConnect);
    DataTable table = new DataTable();
    adapter.Fill(table);
    if (table.Rows.Count <= 0)
    {
        // label_Message.ForeColor = Color.Red;
        // label_Message.Text = "Username Or Password Are Invalid";
        //timer1.Start();
        MessageBox.Show("Username Or Password Are Invalid");
    }
    else
    {
        //  panel1.Height = 0;
        //  label_Message.ForeColor = Color.Green;
        //  label_Message.Text = "Login Successfully";
        //   timer1.Start();
        MessageBox.Show("Login Successfully");
        admin1 admin1 = new admin1();
        admin1.Show();
        this.Hide();
    }
    table.Clear();
}