我希望能够计算然后通过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。这是我唯一不确定的唯一标准。
答案 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