我想用姓氏对我的桌子进行分区?

时间:2014-05-02 14:44:28

标签: mysql sql

我希望能够计算然后通过C.LastName上的计数对我的表进行分区。我只是在学习SQL,并不完全确定COUNT(...)行如何在程序中运行。

这是对LastName上的表进行计数和分区的正确方法吗?

出于某种原因,SQL中的这行代码似乎是一个很难看的东西,看它是如何完全有效的。

 select C.*,
        COUNT(*) over (partition by c.LastName) as '--Count--'
 from Customer C;

表:

PrimaryKey  FirstName   LastName    MiddleName  PhoneNumber Address1    Address2    City    State   Zipcode
1   Test1                   LTest1                  MTest1                  5555555555      555 Governors                                       5555 Governors Avenue                               Pierre      TT          99999
2   Test2                   LTest2                  MTest2                  4444441234      444 Governors Street                                4444 Governors Blvd                                 Bill        PP          44444
3   Test3                   LTest3                  MTest3                  3333331234      333 Governors Street                                3333 Governors Street                               Pop         RR          33333
4   Test1                   LTest1                  MTest9                  7777777777      77 Governors Avenue                                 7 Governors Street                                  Yet         UU          22222
10  FirstName               LastNme                 MiddleName              8888888889      321 H Street                                        4321 U Street                                       TownUSA     VB          77777
11  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
12  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
13  NULL    A                       LTest                   NULL    HTest                                               NULL    NULL    NULL    NULL
14  Test14                  LTest14                 MTest14                 1231231234      123 VVV                                             Billings                                            Billings    NULL    NULL
15  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
16  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
17  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
18  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
19  NULL    test                    NULL    NULL    NULL    NULL    NULL    NULL    NULL
20  NULL    NULL    NULL    1               123 ave                                             123 ave                                             NULL    NULL    NULL

客户表:

1   Test1                   LTest1                  MTest1                  5555555555      555 Governors                                       5555 Governors Avenue                               Pierre      TT          99999
2   Test2                   LTest2                  MTest2                  4444441234      444 Governors Street                                4444 Governors Blvd                                 Bill        PP          44444
3   Test3                   LTest3                  MTest3                  3333331234      333 Governors Street                                3333 Governors Street                               Pop         RR          33333
4   Test1                   LTest1                  MTest9                  7777777777      77 Governors Avenue                                 7 Governors Street                                  Yet         UU          22222
10  FirstName               LastNme                 MiddleName              8888888889      321 H Street                                        4321 U Street                                       TownUSA     VB          77777
11  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
12  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
13  NULL    A                       LTest                   NULL    HTest                                               NULL    NULL    NULL    NULL
14  Test14                  LTest14                 MTest14                 1231231234      123 VVV                                             Billings                                            Billings    NULL    NULL
15  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
16  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
17  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
18  NULL    A                       NULL    NULL    NULL    NULL    NULL    NULL    NULL
19  NULL    test                    NULL    NULL    NULL    NULL    NULL    NULL    NULL
20  NULL    NULL    NULL    1               123 ave                                             123 ave   

                                        NULL    NULL    NULL

新查询:

SELECT C.*,
        A.B as "--Count--"
FROM Customer c
INNER JOIN
(
  SELECT lastname,
         count(*) as B
  FROM customer
  GROUP BY lastname
) A
ON c.lastname = A.lastname;

谢谢你向我展示这个例子。将计数(*)改为B(我改变了一些变量,以便我可以看到你可以.A和B不是一个好的变量名来使用。

作为B的count(*)是否引用该select语句中的lastname。这是我唯一不确定的唯一标准。

2 个答案:

答案 0 :(得分:2)

如果您想计算姓氏相同的人,那么您的语法是正确的。那些窗口函数起初看起来有点令人生畏,但只是玩它,看看你的结果,你应该没事。您发布问题的事实表明您获得了与预期不同的结果,是吗?

编辑: 我跳到结论并假设sqlserver ...

答案 1 :(得分:2)

如果您使用的是MySQL,则COUNT(*)不是受支持的分析函数。您可以使用以下查询来获得相同的结果:

SELECT 
    C.*,
    counts_lastname.cnt_lastname as "--Count--"
FROM Customer c
INNER JOIN
(
  SELECT 
  lastname,
  count(*) as cnt_lastname
  FROM customer
  GROUP BY lastname
) counts_lastname
ON c.lastname = counts_lastname.lastname;

<强>参考

Analytic functions: SUM, AVG, ROW_NUMBER on EXPLAIN EXTENDED blog

A related question on SO