MySQL查询按日期分组,并检索行上的varchar值


MySQL query grouping by date and retrieving varchar value on row

这很可能在其他地方得到了回答,我找不到任何东西,所以如果你能链接到另一个帖子,那将是王牌。

我有一个MySQL表,其中列出了门票和付款,以及其他列。我没有设计桌子,我不能改变太多;添加一列是不可能的。以下是表格的简化版本:

CREATE TABLE cases (
    id INT PRIMARY, 
    created TIMESTAMP, -- when created in db- each day the table is truncated and a new csv imported
    opened DATE, -- will differ from the timestamp, this is the column I want to group by
    total DECIMAL, -- not relevant in this question but i'm totaling this by month too
    tickets VARCHAR(256) -- the one I want to count, two tickets would look like '"foo1234","baa5678"', there is no pattern (i.e. Same prefix) in the tickets either
);

tickets列可能引用了多个票证。每个引用在DB中都用双引号括起来(我觉得这有点不安全,不是我的决定,我真的无法更改它),每个引用都用逗号分隔(如果有不止一个)。

还有其他列,如客户端名称和关闭日期,但在本例中它们与无关

我写了一个查询,它将按月份、年份对行进行分组,并对每个月的付款总额进行分组。我希望结果还包括门票的计数,每月逐项列出。可以假设,总会有至少一张票。在前端,我要么计算逗号并添加一个,要么用逗号分解并计算数组,这对于满行的手来说很好(一行中很少有超过4张票),但由于这将形成整个数据库的报告,我希望它更高效。

我没有任何代码可以发布(我不想找人帮我写,只是给我指明正确的方向,也许有一种方法我忘了。SUM(),但带有字符串。

使用CONCAT_WS可以很容易地解决此问题,请在此处阅读

CONCAT_WS将使用您选择的分隔符连接字符串,在您的情况下,您可以使用逗号:CONCAT_WS(',',string_column)

这会给你一个所有用逗号分隔的字符串。如果你真的需要计数,你可以继续这样做:如何在逗号分隔列表MySQL 中计数项目

使用此选项将得到:

LENGTH(CONCAT_WS(',',string_column)) - LENGTH(REPLACE(CONCAT_WS(',',string_column), ',', ''))+1

+1,因为您需要比逗号的多一个结果