Sql server 根据SQL Server中的唯一标识符合并多行(SQL Server的组\u CONCAT)?
我最初试图通过PHP解决这个问题,但是我没有太多的运气 因为我还没有找到解决方案,所以我决定尝试通过我的SQL查询来解决我的问题。我需要知道的是如何“合并”此查询中返回行之间的差异Sql server 根据SQL Server中的唯一标识符合并多行(SQL Server的组\u CONCAT)?,sql-server,database,sql-server-2008-r2,Sql Server,Database,Sql Server 2008 R2,我最初试图通过PHP解决这个问题,但是我没有太多的运气 因为我还没有找到解决方案,所以我决定尝试通过我的SQL查询来解决我的问题。我需要知道的是如何“合并”此查询中返回行之间的差异 SELECT Item.ID, Item.ItemLookupCode, nitroasl_pamtable.ManufacturerPartNumber, SupplierList.ReorderNumber, Item.Notes, Item.Description, Item.Ex
SELECT
Item.ID,
Item.ItemLookupCode,
nitroasl_pamtable.ManufacturerPartNumber,
SupplierList.ReorderNumber,
Item.Notes,
Item.Description,
Item.ExtendedDescription,
Item.Quantity,
nitroasl_pamtable.SpoofStock,
Item.Price,
nitroasl_pamtable.PAM_Keywords
FROM
Item
JOIN
nitroasl_pamtable ON Item.ID = nitroasl_pamtable.ItemID
JOIN
SupplierList ON Item.ID = SupplierList.ItemID
WHERE
(Item.ItemLookupCode LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR
(nitroasl_pamtable.ManufacturerPartNumber LIKE '%tp-ac1750%'
AND Price > 0.00 AND WebItem = 1)
OR
(SupplierList.ReorderNumber LIKE '%tp-ac1750%' AND Price > 0.00
AND WebItem = 1)
OR
(Item.Notes LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR
(Item.Description LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR
(Item.ExtendedDescription LIKE '%tp-ac1750%' AND Price > 0.00
AND WebItem = 1)
OR
(nitroasl_pamtable.PAM_Keywords LIKE '%tp-ac1750%' AND Price > 0.00
AND WebItem = 1)
ORDER BY
Item.ItemLookupCode ASC;
我认为我需要的(但尚未成功实施)
MySQL的等价物
我相信这个函数可以满足我的需要,但我使用的是SQL Server,而不是MySQL。而且我似乎无法获得如何为我工作的张贴解决方案
我所尝试的:
最近,我尝试了MAX()
和GROUP BY
函数(一起),但它选择了在重复行中返回的MAX
值,从而返回了一行,每列中都有MAX
值
SELECT
MAX(Item.ID) AS Id,
Item.ItemLookupCode,
MAX(nitroasl_pamtable.ManufacturerPartNumber) AS ManufacturerPartNumber,
MAX(SupplierList.ReorderNumber) AS ReorderNumber,
MAX( CAST(Item.Notes AS varchar(max)) ) AS Notes,
MAX(Item.Description) AS Description,
MAX( CAST(Item.ExtendedDescription AS varchar(max)) ) AS ExtendedDescription,
MAX(Item.Quantity) AS Quantity,
MAX(nitroasl_pamtable.SpoofStock) AS SpoofStock,
MAX(Item.Price) AS Price,
MAX(nitroasl_pamtable.PAM_Keywords) AS PAM_Keywords,
MAX(Item.PictureName) AS PictureName
FROM
Item
LEFT JOIN
nitroasl_pamtable ON Item.ID = nitroasl_pamtable.ItemID
LEFT JOIN
SupplierList ON Item.ID = SupplierList.ItemID
WHERE
(Item.ItemLookupCode LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR (nitroasl_pamtable.ManufacturerPartNumber LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR (SupplierList.ReorderNumber LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR (Item.Notes LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR (Item.Description LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR (Item.ExtendedDescription LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
OR (nitroasl_pamtable.PAM_Keywords LIKE '%tp-ac1750%' AND Price > 0.00 AND WebItem = 1)
GROUP BY
Item.ItemLookupCode
ORDER BY
Item.ItemLookupCode ASC
我不想丢弃每一列的变体,而是想将每一列的所有返回值(用MAX丢弃)放入各自的/原始列中,并用逗号分隔
我需要的是:
在上面的文件中,您将看到上述SQL查询返回的四行。我希望返回一行,如下所示:
ID:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
项目查找代码:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
制造商零件号:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
重新订购编号:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
注意事项:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
说明:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
扩展描述:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
数量:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
SpoofStock:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
价格:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
PAM\u关键词:
8265
TP-AC1750
Archer C7
7681617, ARCHERC7, N82E16833704177
TP-LINK Archer C7 AC1750 Routr
TP-LINK Archer C7 AC1750 Routr
TP-Link Archer C7 Wireless-AC1750 Dual-Band Gigabit Router
0 (This should actually be a combined sum/total of the values in this column)
NULL (Same as Quantity - Should be sum / This value is different than Quantity)
129.95
NULL
我知道有更好的方法来编写这个查询。我只是不是一个SQL的家伙。此查询/脚本是一个关键字搜索,返回Microsoft Dynamics RMS数据库中的项目,并输出JSON,我使用它创建可以更改并重新提交到DB的产品列表。我使用SQL Server 2008 R2(如果这很重要的话)。任何关于如何使用我的查询的一些变体来完成上述输出的建议都将不胜感激!谢谢
更新(SQLFIDLE)
这里有一个指向SQLFIDLE的链接可供使用:)
(这不是一个可行的解决方案,因为我丢失了数据)如果我正确理解了这一点,看起来您只需要将
重新排序编号
字段串联起来。您可以使用SQLCLR用户定义聚合(UDA)来简单地完成这项工作
在SQLCLR函数库、存储过程库等(我是该库的作者,但此聚合函数在免费版本中提供)中有一个预先完成的UDA来完成此操作,名为Agg_Join。使用它将使您的查询如下所示:
选择
最大(项目ID)作为ID,
Item.ItemLookupCode,
MAX(nitroasl_pamtable.制造商零件号)作为制造商零件号,
SQL#.Agg_Join(SupplierList.ReorderNumber)作为ReorderNumber,
MAX(将Item.Notes转换为varchar(MAX)),作为注释,
最大值(项目说明)作为说明,
MAX(将Item.ExtendedDescription转换为varchar(MAX)))作为ExtendedDescription,
最大(项目数量)作为数量,
MAX(nitroasl_pamtable.SpoofStock)作为SpoofStock,
最高(项目价格)作为价格,
MAX(nitroasl\u pamtable.PAM\u关键字)作为PAM\u关键字,
最大值(项目PictureName)为PictureName
从项目
左连接nitroasl_pamtable
在Item.ID=nitroasl\u pamtable.ItemID上
左连接供应商列表
ON Item.ID=SupplierList.ItemID
哪里
(Item.ItemLookupCode类似于“%tp-ac1750%”,且价格>0.00且WebItem=1)
或(nitroasl_pamtable.ManufacturerPartNumber,如“%tp-ac1750%”
价格>0.00
和WebItem=1)
或(类似“%tp-ac1750%”的供应商列表.ReorderNumber
价格>0.00
和WebItem=1)
或(Item.Notes,如“%tp-ac1750%”和Price>0.00且WebItem=1)
或(项目说明,如“%tp-ac1750%”,价格>0.00,WebItem=1)
或(Item.ExtendedDescription,如“%tp-ac1750%”,价格>0.00,WebItem=1)
或者(nitroasl_pamtable.PAM_关键字,如“%tp-ac1750%”,价格>0.00,WebItem=1)
按项分组。项查找代码
按项目排序。项目查找代码ASC;
值得一提的是,SQL的完整版本包括一个功能更强大的Agg_Join版本,称为Agg_JoinPlus,它允许排序、过滤重复项、替换NULL
s、更改分隔符等
或者,如果您想自己创建它,在这种情况下您可以自定义功能,我写了一篇文章,展示了创建用户定义聚合的示例,该聚合只需稍加修改即可实现字符串连接:(需要免费注册)。这是在SQL Server 2008问世之前编写的,它能够将MaxSize
设置为-1
,以便一次可以存储8000多个字节(这对于这种类型的操作来说比对于许多算术操作来说更为重要)
另一个不需要订阅并且应该开箱即用的选项(我自己没有尝试过)是这个开源项目:
该项目自2013-05-09年以来一直没有更新过,但我怀疑它可以做您想要的事情,并且可以像SQL.\Agg#u Join和任何其他聚合一样适合您的查询。在包含程序集和T-sql包装器对象的安装脚本文件夹中有一个安装脚本GroupConcatInstallation.sql
是的,所有这些聚合都应该与PHP或其他任何东西一起使用,因为它们是查询的一部分,因此由SQL Server进行处理,而与任何特定的客户端软件无关。这将让您开始学习,但nitroasl_pamtable表仍然存在一些不确定性,所以我没有包括这个
SELECT
I.ID,
I.ItemLookupCode,
I.Notes,
I.Description,
I.ExtendedDescription,
I.Quantity,
I.Price,
SL.ReorderNumbers,
P.SpoofStock,
P.ManufacturerPartNumber,
P.PAM_Keywords
FROM
Item I
LEFT JOIN nitroasl_pamtable P
ON I.ID = P.ItemID
OUTER APPLY (
SELECT
ReorderNumbers = Substring((
SELECT DISTINCT Convert(varchar(max), ', ' + SL.ReorderNumber)
FROM SupplierList SL
WHERE I.ID = SL.ItemID
FOR XML PATH(''), TYPE
).value('.[1]', 'varchar(max)'), 3, 2147483647)
) SL
WHERE
I.Price > 0.00
AND I.WebItem = 1
AND (
I.ItemLookupCode LIKE '%tp-ac1750%'
OR I.Notes LIKE '%tp-ac1750%'
OR I.Description LIKE '%tp-ac1750%'
OR I.ExtendedDescription LIKE '%tp-ac1750%'
OR P.ManufacturerPartNumber LIKE '%tp-ac1750%'
OR P.PAM_Keywords LIKE '%tp-ac1750%'
OR EXISTS (
SELECT *
FROM dbo.SupplierList SL2
WHERE
I.ID = SL2.ItemID
AND SL2.ReorderNumber LIKE '%tp-ac1750%'
)
)
ORDER BY
I.ItemLookupCode ASC;
引入nitroasl\u pamtable