使用SQL / Mysql部分枚举行

时间:2013-05-30 13:26:00

标签: mysql sql

我一直在思考/谷歌搜索这个问题没有结果...... 我试图以部分方式枚举查询BUT的结果,即通过为每个新代码重置计数器。在这里和示例中,我还需要每个代码的部分总计数:

表A:

CODE CUSTOMER
A     33
A     34
A     45
B     10
B     22
C     33

以下代码为我提供了部分结果:

SELECT A.code, A.customer, B.total FROM A
INNER JOIN (SELECT code, count(*) AS total FROM A GROUP BY code) AS B
WHERE A.code=B.code

CODE   CUSTOMER TOTAL  PARTIAL
A      33        3      1
A      34        3      2
A      45        3      3
B      10        2      1
B      22        2      2
C      33        1      1

除了代码的PARTIAL列计数器....我不知道如何生成....任何想法? 谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用MySQL中的变量执行此操作。但是,您也可以使用标准SQL,使用相关子查询:

select a.*,
       (select count(*)
        from A a1
        where a1.code = a.code and
              a1.customer <= a.customer
       ) as Partial
from A

答案 1 :(得分:0)

这是一个混乱的问题,因为MySQL不像任何其他RDBMS那样支持窗口函数。所以这样做的一种方法是使用用户变量。

SELECT  code, customer, total, RowNumber -- final columns
FROM
        (
            SELECT  code,
                    customer,
                    total,
                    @sum := if(@cde = code, @sum ,0) + 1 RowNumber,
                    @cde := code
            FROM    
                    ( -- this part is your original query
                        SELECT  A.code, 
                                A.customer, 
                                B.total 
                        FROM    TableName a
                                INNER JOIN 
                                (
                                    SELECT  code, count(*) AS total 
                                    FROM    TableName 
                                    GROUP   BY code
                                ) AS B ON A.code = B.code
                    ) d,
                     -- declaring of user variables
                    (select @cde := '', @sum := 0) vars
            ORDER   BY  code, customer
        ) s

输出

╔══════╦══════════╦═══════╦═══════════╗
║ CODE ║ CUSTOMER ║ TOTAL ║ ROWNUMBER ║
╠══════╬══════════╬═══════╬═══════════╣
║ A    ║       33 ║     3 ║         1 ║
║ A    ║       34 ║     3 ║         2 ║
║ A    ║       45 ║     3 ║         3 ║
║ B    ║       10 ║     2 ║         1 ║
║ B    ║       22 ║     2 ║         2 ║
║ C    ║       33 ║     1 ║         1 ║
╚══════╩══════════╩═══════╩═══════════╝