如何在sql中获取记录数

时间:2014-03-07 12:44:14

标签: sql sql-server

我的sql表结构是:

Order No.   |  Carton No  | ...  .& so on
D1               1
D1               2
D1               3
D1               4
D2               5
D2               6 

我想得到Carton No group by Count No。和记录中包含的记录。 像这样 -

OrderNo  | Count | Carton No
D1          4        1,2,3,4
D2          2         5,6

是否可以使用sql查询获得所需的结果。

3 个答案:

答案 0 :(得分:2)

SELECT "Order No.",COUNT("Order No.")as Count ,
listagg("Carton No" , ',') within group (order by "Carton No") "Carton No"
FROM tableName
GROUP BY "Order No."

SQL Server

SELECT [Order No.],COUNT([Order No.])as Count ,
[Carton No]=STUFF((SELECT ','+[Carton No] FROM tableName WHERE [Order No.]=A.[Order No.]
FOR XML PATH('')) , 1 , 1 , '' )
FROM 
tableName A
GROUP BY [Order No.]

答案 1 :(得分:0)

COUNT()函数可以获得计数,但逗号分隔的列表要困难得多。至于ANSI标准SQL,没有。您要求的是对查询结果进行非规范化,因此标准的SQL响应是在应用程序中执行此操作,而不是在SQL中执行此操作。这是一个显示问题。

但是,许多RDBMS都有特定于供应商的聚合函数,但是:

Oracle:wm_concat()LISTAGG()wm_concat()较早,但从未被视为记录在案的功能。

MySQL:GROUP_CONCAT()

PostgreSQL:array_agg()string_agg()。旧版本可能不具备这两种功能或任何一种功能。

MS SQL:这个非常困难。您通常必须将STUFF()FOR XML PATH('')结合使用。但是,此行为不是记录的行为,因此应被视为已弃用。在SQL Server 2005引入FOR XML PATH('')语句之前,我不相信有任何好方法可以做到这一点。

SQLite:GROUP_CONCAT()

答案 2 :(得分:0)

DECLARE @MYTABLE TABLE(ID NVARCHAR(5),zone CHAR(1))
INSERT INTO @MYTABLE VALUES
('D1',1),('D1',2),('D1',3),
('D1',4),('D2',5),('D2',6)
SELECT  t.ID,COUNT(ID) AS [Count]
       ,STUFF((SELECT '/'+ zone
               FROM @MYTABLE
               WHERE ID = t.ID
               FOR XML PATH(''),TYPE).
               value('.','NVARCHAR(MAX)'),1,1,'') AS Zones
FROM @MYTABLE t
GROUP BY t.ID