Sql 如何仅从唯一键填充值

Sql 如何仅从唯一键填充值,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我相信这是一个非常简单的问题,答案也同样简单,但我无法理解 我有一个这样建模的临时表,查询返回的数据如下: +--------+------+---------+---------+--------+-----------+--------+-----+ | Acct # | PO # | Store # | Order # | Line # | Ship Date | Item # | Qty | +--------+------+---------+---------+--------+--

我相信这是一个非常简单的问题,答案也同样简单,但我无法理解

我有一个这样建模的临时表,查询返回的数据如下:

+--------+------+---------+---------+--------+-----------+--------+-----+
| Acct # | PO # | Store # | Order # | Line # | Ship Date | Item # | Qty |
+--------+------+---------+---------+--------+-----------+--------+-----+
|  0777  | 3340 |   648   | 1756013 |   1    | 11/23/16  | 100598 |  1  |
|  0777  | 3340 |   648   | 1756013 |   2    | 11/23/16  | 100597 |  1  |
|  0777  | 3340 |   648   | 1756013 |   3    | 11/23/16  | 100598 |  1  |
|  0777  | 3340 |   648   | 1756013 |   4    | 11/23/16  | 100596 |  1  |
|  0777  | 3341 |   720   | 1760001 |   1    | 12/01/16  | 150962 |  1  |
|  0777  | 3341 |   720   | 1760001 |   3    | 12/01/16  | 100596 |  1  |
|  0777  | 3341 |   720   | 1760001 |   4    | 12/01/16  | 150961 |  1  |
|  0777  | 3341 |   720   | 1760001 |   7    | 12/01/16  | 150961 |  1  |
|  0777  | 3341 |   720   | 1760001 |   8    | 12/01/16  | 156961 |  1  |
+--------+------+---------+---------+--------+-----------+--------+-----+
我应该将类似的行合并在一起,以便对于订单号上相同的每个项目编号,数量从1增加到2,等等。我让这部分工作,但为了做到这一点,我必须去掉行号,因此返回的数据如下所示:

+--------+------+---------+---------+-----------+--------+-----+
| Acct # | PO # | Store # | Order # | Ship Date | Item # | Qty |
+--------+------+---------+---------+-----------+--------+-----+
|  0777  | 3340 |   648   | 1756013 | 11/23/16  | 100598 |  2  |
|  0777  | 3340 |   648   | 1756013 | 11/23/16  | 100597 |  1  |
|  0777  | 3340 |   648   | 1756013 | 11/23/16  | 100596 |  1  |
|  0777  | 3341 |   720   | 1760001 | 12/01/16  | 150962 |  1  |
|  0777  | 3341 |   720   | 1760001 | 12/01/16  | 100596 |  1  |
|  0777  | 3341 |   720   | 1760001 | 12/01/16  | 150961 |  3  |
+--------+------+---------+---------+-----------+--------+-----+
但是,我需要Line#列来准确地报告正在处理、装运的订单行等。我知道STUFF()函数可以做到这一点,除了它添加每一行,而不仅仅是特定于订单的行。我的问题是:

SELECT DISTINCT
    SupplierAcctNumber AS 'Acct #',
    BuyerPONumber AS 'PO #',
    BuyerStoreNumber AS 'Store #',
    SupplierOrderNumber AS 'Order #',
    SupplierOrderLine =
        STUFF((SELECT ',' + CAST(t.SupplierOrderLine AS VARCHAR)
            FROM @temp t
            WHERE t.SupplierOrderNumber = SupplierOrderNumber
                AND t.BuyerItemNumber = BuyerItemNumber FOR XML PATH ('')),1,1,''),
    SupplierShipDate AS 'Ship Date',
    BuyerItemNumber AS 'Item #',
    SUM(SupplierQtyOrdered) AS 'Qty'
FROM @temp
GROUP BY SupplierAcctNumber, BuyerPONumber, BuyerStoreNumber, SupplierOrderNumber,
    SupplierOrderLine, SupplierShipDate, BuyerItemNumber
ORDER BY SupplierOrderNumber
以下是我得到的结果:

+--------+------+---------+---------+-------------------+-----------+--------+-----+
| Acct # | PO # | Store # | Order # | Line #            | Ship Date | Item # | Qty |
+--------+------+---------+---------+-------------------+-----------+--------+-----+
|  0777  | 3340 |   648   | 1756013 | 1,2,3,4,1,3,4,7,8 | 11/23/16  | 100598 |  2  |
|  0777  | 3340 |   648   | 1756013 | 1,2,3,4,1,3,4,7,8 | 11/23/16  | 100597 |  1  |
|  0777  | 3340 |   648   | 1756013 | 1,2,3,4,1,3,4,7,8 | 11/23/16  | 100596 |  1  |
|  0777  | 3341 |   720   | 1760001 | 1,2,3,4,1,3,4,7,8 | 12/01/16  | 150962 |  1  |
|  0777  | 3341 |   720   | 1760001 | 1,2,3,4,1,3,4,7,8 | 12/01/16  | 100596 |  1  |
|  0777  | 3341 |   720   | 1760001 | 1,2,3,4,1,3,4,7,8 | 12/01/16  | 150961 |  3  |
+--------+------+---------+---------+-------------------+-----------+--------+-----+
以下是我预期的结果:

+--------+------+---------+---------+-------------------+-----------+--------+-----+
| Acct # | PO # | Store # | Order # | Line #            | Ship Date | Item # | Qty |
+--------+------+---------+---------+-------------------+-----------+--------+-----+
|  0777  | 3340 |   648   | 1756013 | 1,3               | 11/23/16  | 100598 |  2  |
|  0777  | 3340 |   648   | 1756013 | 2                 | 11/23/16  | 100597 |  1  |
|  0777  | 3340 |   648   | 1756013 | 4                 | 11/23/16  | 100596 |  1  |
|  0777  | 3341 |   720   | 1760001 | 1                 | 12/01/16  | 150962 |  1  |
|  0777  | 3341 |   720   | 1760001 | 3                 | 12/01/16  | 100596 |  1  |
|  0777  | 3341 |   720   | 1760001 | 4,7,8             | 12/01/16  | 150961 |  3  |
+--------+------+---------+---------+-------------------+-----------+--------+-----+

这里有一条路。我相信还有更好的。。。但对于你的结构来说,它会起作用的。 另外,你认为150961应该是你上一次记录中的项目,而不是156961

select
    [Acct #],
    [PO #],
    [Store #],
    [Order #],
    STUFF((SELECT ', ' + cast([Line #] as varchar) from #tt where [Order #] = t.[Order #] and [Item #] = t.[Item #] FOR XML PATH ('')), 1, 1, '') as [Line #],
    [Ship Date],
    [Item #],
    SUM(Qty) as Qty
from #tt t
group by 
    [Acct #],
    [PO #],
    [Store #],
    [Order #],
    [Ship Date],
    [Item #]

正如评论中提到的那样,这个问题只是简单地混淆了内容的编写方式。调整后,查询应如下所示,@temp的表别名位于stuff语句之外:

SELECT DISTINCT
    SupplierAcctNumber AS 'Acct #',
    BuyerPONumber AS 'PO #',
    BuyerStoreNumber AS 'Store #',
    SupplierOrderNumber AS 'Order #',
    SupplierOrderLine =
        STUFF((SELECT ',' + CAST(t.SupplierOrderLine AS VARCHAR)
            FROM @temp
            WHERE t.SupplierOrderNumber = SupplierOrderNumber
                AND t.BuyerItemNumber = BuyerItemNumber FOR XML PATH ('')),1,1,''),
    SupplierShipDate AS 'Ship Date',
    BuyerItemNumber AS 'Item #',
    SUM(SupplierQtyOrdered) AS 'Qty'
FROM @temp t
GROUP BY SupplierAcctNumber, BuyerPONumber, BuyerStoreNumber, SupplierOrderNumber,
    SupplierOrderLine, SupplierShipDate, BuyerItemNumber
ORDER BY SupplierOrderNumber;

你把事情搞混了。你的stuff语句应该是@temp中的
而不需要表别名,你的主查询应该是@temp t
中的
我认为150961应该是你上一条记录中的项目,而不是15696wooow。。。。我真不敢相信我没听懂。非常感谢。你能给我一个答案让我给你评分吗?@scsimon你是对的。我只是插入了虚拟数据,没有引起足够的注意。@ZLK你能发布你的答案吗?这样我就可以相信你先弄明白了吗?