我的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查询获得所需的结果。
答案 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