sqlite Android:如何获取表中唯一值的计数,其中唯一值是使用where子句的两列的组合

deyfvvtc  于 2022-11-24  发布在  SQLite
关注(0)|答案(2)|浏览(153)

我正在使用此查询获取基于列表的值
查询:

select * from Assignment_Data_RAD where Rfid IN ( '34E59808D8400410C2048F48','3460881C004610224927D013','3C60881C00461020420FD000','3C60881C00461020420C107D','3DD00000000000103D004188','3460881C00461020420FD000' )

结果:

所需结果是基于GS_1_BARCODE和类别的数量计数

Category             |        Gs1     |    Qty
shoppingbags 15/1000 | 62870164212311 |   1 
shoppingbags 15/1000 | 628701642999   |   1 
shoppingbags 15/1000 | 628701642123   |   2 
Thermal Bags 16      | 628701642999   |   2

我还需要所有其他列沿着上述数据。
我还需要在当前查询中添加哪些内容,才能根据Rfid列表中的类别和gs1条形码列获得数量总和

2exbekwf

2exbekwf1#

我还需要在当前查询中添加哪些内容,才能根据Rfid列表中的类别和gs1条形码列获得数量总和
可以使用group_concat集合函数
例如:

SELECT 
    category, GS_1_BARCODE as gs1, sum(qty) AS qty, group_concat(rfid) AS rfidlist 
FROM Assignment_Data_RAD
WHERE rfid IN ( 
    '34E59808D8400410C2048F48',
    '3460881C004610224927D013',
    '3C60881C00461020420FD000',
    '3C60881C00461020420C107D',
    '3DD00000000000103D004188',
    '3460881C00461020420FD000' 
)
GROUP BY category,GS_1_BARCODE;

结果:-

我还需要所有其他列沿着上述数据
虽然您可以group_concat所有其他数据行,但是将值相关起来可能会很困难。
另一种方法是生成组的组合,作为标题行沿着实际数据行,例如:

  • 注意,标题行中的值(第一行突出显示了任意值)应该(除非它们构成分组的一部分)是来自分组行之一的任意值。
  • 它们是任意值,因为对于组,每个列都有多个基础值,但这些列只有一个值表示

上述内容可使用以下方式创建:

WITH
    headers AS (
        SELECT 0 AS flag,*, 
            sum(qty) AS quantity_sum 
        FROM Assignment_Data_RAD
        WHERE rfid IN ( 
            '34E59808D8400410C2048F48',
            '3460881C004610224927D013',
            '3C60881C00461020420FD000',
            '3C60881C00461020420C107D',
            '3DD00000000000103D004188',
            '3460881C00461020420FD000' 
        )
        GROUP BY category,GS_1_BARCODE
    ),
    alldata AS (
        SELECT 1 AS flag,*,null
        FROM Assignment_Data_RAD
        WHERE rfid IN ( 
            '34E59808D8400410C2048F48',
            '3460881C004610224927D013',
            '3C60881C00461020420FD000',
            '3C60881C00461020420C107D',
            '3DD00000000000103D004188',
            '3460881C00461020420FD000' 
        )
    )
SELECT 
    CASE WHEN flag THEN 'DATAROW' ELSE 'HEADER' END AS type, * 
FROM headers 
UNION ALL 
SELECT 
    CASE WHEN flag THEN 'DATAROW' ELSE 'HEADER' END AS type,* 
FROM alldata 
ORDER BY category,gs_1_BARCODE,flag;
  • 注意,这使用CTE(公共表表达式)(标题和所有数据是CTE),CTE是在执行期间存在的有效临时表。
uajslkp6

uajslkp62#

您无法将某些数据分组并保留所有原始数据。这意味着没有分组。
即使在您的示例中,您也只能使用与列分组在一起的那些列。

SELECT Category, Gs1, COUNT(*) as Qty FROM Assignment_Data_RAD GROUP BY Category, Gs1;

相关问题