【发布时间】:2018-05-22 12:54:37
【问题描述】:
大家好,这是我的问题。
我的查询输出如下所示(精简为几行):
|number |line |partNum |phoneNum |qty_SN |qty_Property |qty_Name |qty_Time
------------------------------------------------------------------------------
|87 |1 |55G5 |555-789-7512 |00123 |Local |Owner |05:22
|87 | | | |14988 |Local |Seller |10:44
|87 | | | |521 |Remote |Owner |01:05
|87 | | | |50697 |Local |Seller |11:41
|87 | | | |2359 |Remote |Seller |04:45
而我想做的是:
|number |line |partNum |phoneNum |qty_SN |qty_Property |qty_Name |qty_Time
------------------------------------------------------------------------------------------------------------------------------------------------------------------
|87 |1 |55G5 |555-789-7512 |00123,14988,521,50697,2359 |Local,Local,Remote,Local,Remote |Owner,Seller,Owner,Seller,Seller |05:22,10:44,01:05,11:41,04:45
请注意,所有 qty_ 列都合并到 第一个完整数据行中,而不是像第一个表中那样位于各自的行中。
第一个表的查询看起来像这样(再次被精简):
;WITH TheDATA AS (
SELECT
BL.number AS 'number',
BL.line AS 'line',
BL.partNumber AS 'partNum',
BL.phoneNumber AS 'phoneNum',
L.qtySN AS 'qty_SN',
I.qtyProperty AS 'qty_Property',
I.qtyName AS 'qty_Name',
I.qtyTime AS 'qty_Time',
ROW_NUMBER() Over (
PARTITION BY
BL.number
ORDER BY
BL.number
) AS 'RowNo'
FROM
BList AS BL
INNER JOIN Location AS L
ON BL.ID = L.Route
INNER JOIN Inventory AS I
ON L.ID = I.prodID
)
SELECT
number AS 'number',
IIF(RowNo = 1, CONVERT(varchar, line), '') AS 'line',
IIF(RowNo = 1, partNumber, '') AS 'partNum',
IIF(RowNo = 1, phoneNumber, '') AS 'phoneNum',
qty_SN AS 'qty_SN',
qty_Property AS 'qty_Property',
qty_Name AS 'qty_Name',
qty_Time AS 'qty_Time'
FROM
TheData
【问题讨论】:
-
您的
TheDATACTE 没有名为RowNo的列,sql server 中也没有名为IFF()的内置函数 -
@avb 已将 IFF 更正为 IIF 和 AS 'RowNo'。感谢您了解这一点。
-
您需要 4 个子查询,这些子查询使用有序 FOR XML 对具有 ROW_NUMBER 的集合进行正确排序。
-
@StealthRT 我看不出那个 AS 'RowNo' 是如何解决任何问题的。
-
制表符半列,我的眼睛在流血!
标签: sql sql-server tsql sql-server-2016