sql 分组后怎么把结果合并到一个类别下啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 分组后怎么把结果合并到一个类别下啊相关的知识,希望对你有一定的参考价值。

合并后

就是水果的显示到一个类别下
蔬菜的在一个类别下

--如果商品和类别在同一个表
--建表
Create Table T
(
    商品 Varchar(10),
    类别 Varchar(10),
    数量 Int
)

--插入数据
Insert Into T Values('苹果','水果',10)
Insert Into T Values('葡萄','水果',20)
Insert Into T Values('西红柿','蔬菜',30) 

--方法一,按商品类别分类求和,加with cube选项
Select ISNULL(商品,'分类-'+类别) As 商品,数量 
From (
    Select 商品,类别,SUM(数量) As 数量 From T
    Group By 商品,类别
    With Cube
    ) S 
Where 类别 Is Not Null

--方法二,按商品和类别分别汇总后合拼在一起,然后排序
Select 商品,数量 
From (
    Select 商品,Max(类别)As 类别,SUM(数量) As 数量 From T
    Group By 商品
    Union All
    Select '分类-'+类别,类别+'Z',SUM(数量) As 数量 From T
    Group By 类别
) S 
Order By 类别

--如果没有类别,需要先建一个对照表
--建表
Create Table M
(
商品 Varchar(10),
类别 Varchar(10)
)
Create Table N
(
商品 Varchar(10),
数量 Int
)

--插入数据
Insert Into M Values('苹果','水果')
Insert Into M Values('葡萄','水果')
Insert Into M Values('西红柿','蔬菜')
Insert Into N Values('苹果',10)
Insert Into N Values('葡萄',20)
Insert Into N Values('西红柿',30)
Insert Into N Values('苹果',15)

--查询
Select IsNull(商品,'分类-'+类别) As 商品,数量 
From (
    Select n.商品,类别,SUM(数量) As 数量 From n Left Join m
    on m.商品=n.商品
    Group By n.商品,类别
    With Cube
) s
Where 类别 is not null

参考技术A 你的表结构是什么,发出来,才好写SQL

将 JSON 结果分组到类别中

【中文标题】将 JSON 结果分组到类别中【英文标题】:Grouping JSON results into categories 【发布时间】:2022-01-18 23:06:51 【问题描述】:

我正在尝试从 JSON 结果集中对一些类似的数字进行分组。我需要将所有 [1, X] 分组到小型/大型组中,将 [0, X] 分组到小型/中型/大型组中。

我认为我需要对数据进行一些预处理并找到数据的平均值或钟形曲线?

$results = json_decode("data": [[0, 2960], [1, 768], [0, 592], [1, 384], [0, 592], [1, 400], [0, 208], [1, 384], [0, 208], [1, 384], [0, 320], [1, 1056], [0, 576], [1, 400], [0, 208], [1, 384], [0, 592], [1, 768], [0, 208], [1, 400], [0, 592], [1, 768], [0, 208], [1, 768], [0, 208], [1, 400], [0, 1360], [1, 384], [0, 208], [1, 400], [0, 192], [1, 784], [0, 208], [1, 384], [0, 592], [1, 768], [0, 224], [1, 768], [0, 208], [1, 768], [0, 592], [1, 384], [0, 208], [1, 768], [0, 224], [1, 368], [0, 1376], [1, 784], [0, 208], [1, 384], [0, 224], [1, 768], [0, 208], [1, 768], [0, 592], [1, 768], [0, 224], [1, 768], [0, 208], [1, 768], [0, 592], [1, 400], [0, 96], [1, 16], [0, 16], [1, 464], [0, 32], [1, 944], [0, 1968], [1, 0]]);

foreach($flashes as $values) 
  $flash_status = $values[0];
  $length = $values[1];

  // flashing
  if($flash_status == 1) 
    if($length is short)
      // do something
    elseif($length is long)
      // do something
   else 
    // pausing
    if($length is short)
      // do something
    elseif($length is medium)
      // do something
    elseif($length is long)
      // do something
  

【问题讨论】:

你如何定义什么是短/中/长? 【参考方案1】:

这就是最终为我工作的原因。对于 180 跳跃仍有硬编码检查,但它现在可以满足我的需要。

        array_multisort($ordering, array_column($ordering, 0));
        $flash_categories = array(
            1 => array (
                'short' => array('min'=> 0,'max'=> 0,),
                'long'  => array('min'=> 0,'max'=> 0,),
            ),
            0 => array (
                'short'  => array('min'=> 0,'max'=> 0,),
                'medium' => array('min'=> 0,'max'=> 0,),
                'long'   => array('min'=> 0,'max'=> 0,),
            ),
        );
        $previous_value = 0;
        $previous_flash = 0;
        $flash_heading_index = 0;
        $flash_headings = array(
            1 => array ('short','long'),
            0 => array ('short','medium','long'),
        );
        foreach($ordering as $values) 
            $flash_status = $values[0];
            $length = $values[1];

            // skip errors
            if($length < 100 || $length > 2000)
                continue;

            if($previous_flash != $flash_status) 
                $previous_flash = $flash_status;
                $flash_heading_index = 0;
                $previous_value = 0;
            

            // check to see how much difference there is in time
            if($length - $previous_value > 180 && $previous_value != 0)
                $flash_heading_index++;

            // cap off the heading index
            if(!isset($flash_headings[$flash_status][$flash_heading_index]))
                $flash_heading_index = sizeof($flash_headings[$flash_status])-1;

            // set min and max threshold to values
            if($flash_categories[$flash_status][$flash_headings[$flash_status][$flash_heading_index]]['min'] == 0) 
                $flash_categories[$flash_status][$flash_headings[$flash_status][$flash_heading_index]]['min'] = $length;
                $flash_categories[$flash_status][$flash_headings[$flash_status][$flash_heading_index]]['max'] = $length;
             else
                $flash_categories[$flash_status][$flash_headings[$flash_status][$flash_heading_index]]['max'] = $length;

            $previous_value = $length;
        

【讨论】:

以上是关于sql 分组后怎么把结果合并到一个类别下啊的主要内容,如果未能解决你的问题,请参考以下文章

如何用SQL SERVER取分组数据第一条

检索按类别分组的 SQL 结果

如何对一系列数据进行分组以在 GOOGLE BigQuery 中创建一个类别

sql 分组排序

mysql分组排序,取每组第一条数据

将 JSON 结果分组到类别中