【问题标题】:Using SQL Server, display some columns as additional rows使用 SQL Server,将某些列显示为附加行
【发布时间】:2013-08-01 16:45:21
【问题描述】:

我有两张桌子,我们叫一张Items 和一张Inventory

items 表有一列用于item#,然后是 3 列用于附件,ACC1ACC2ACC3inventory 表有 item# 和现有数量。

我希望能够显示为:

item#A Acc1 qtyonhand
item#A Acc2 qtyonhand
item#A Acc3 qtyonhand
item#B Acc1 qtyonhand

这样每一行都是商品和独特的配件。如果 Acc1、2 或 3 列为空,则不应显示该行。

我将如何在 SQL 中编写此代码?我为获得这些确切结果所做的每一次尝试都失败了。

提前致谢!

【问题讨论】:

    标签: sql-server syntax rows multiple-columns


    【解决方案1】:

    你只需要使用 UNPIVOT

    BEGIN
    DECLARE @tbl1 as TABLE(num INT, a1 VARCHAR(16), a2 VARCHAR(16), a3 VARCHAR(16)) 
    DECLARE @tbl2 as TABLE(num INT, qty INT)
    INSERT INTO @tbl1 VALUES (1, 'a1', 'b1', 'c1'),(2, null, 'b2', null),(3, 'a3', 'b3', 'c3') 
    INSERT INTO @tbl2 VALUES (1, 5), (2, 10), (3, 7)
    
    SELECT num, acc [acc], qty FROM (
        SELECT a.num, a.a1, a.a2, a.a3, b.qty FROM @tbl1 a
        LEFT JOIN @tbl2 b ON a.num = b.num
    ) t1
    UNPIVOT (
        value FOR acc IN ([a1], [a2], [a3])
    ) u
    END
    

    【讨论】:

    • 非常感谢您的回复。这几乎对我有用,我相信我只需要做一些小事。根据你说的,我有下面的代码。
    • SELECT ItemNumber, acc [acc], QtyOnHandBK FROM ( SELECT a.itemnumber, a.Accessory1, a.Accessory2, a.Accessory3, b.QtyOnHandBK FROM CIX a LEFT JOIN inventory b ON a.itemnumber = b.itemnumber ) t1 UNPIVOT (value FOR acc IN ([Accessory1], [accessory2], [accessory3]) ) u
    • (对不起,我是新来评论的)...上面的这段代码给了我我的项目编号,然后是“Accessory1”,然后是手头的。我想从 a.Accessory1 中查看实际的附件项目。我尝试在 FOR acc IN( 的值之后将 a.accessory1 放在 [ ] 中,但这引发了错误。我需要更改什么?非常感谢您的帮助。
    • @user2642976 - 您将 Accessory1 中的 A 大写,但不是 2 或 3。
    【解决方案2】:

    天真的方法是使用 UNION:

    SELECT i.[item#], ACC1 AS ACC, [quantity on hand]
    FROM items i
    INNER JOIN inventory inv ON i.[item#] = inv.[item#]
    WHERE ACC1 IS NOT NULL
    UNION ALL
    SELECT i.[item#], ACC2 AS ACC, [quantity on hand]
    FROM items i
    INNER JOIN inventory inv ON i.[item#] = inv.[item#]
    WHERE ACC2 IS NOT NULL
    UNION ALL
    SELECT i.[item#], ACC3 AS ACC, [quantity on hand]
    FROM items i
    INNER JOIN inventory inv ON i.[item#] = inv.[item#]
    WHERE ACC3 IS NOT NULL
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多