【问题标题】:SQL UNION query, show results as additional columnsSQL UNION 查询,将结果显示为附加列
【发布时间】:2014-09-24 21:26:21
【问题描述】:

我正在尝试格式化结果,以便合并的结果显示为重复的列。很抱歉没有很好地解释这一点,希望这个简化的例子能更好地展示:

select  * from (
SELECT  Id,
        SKU,
        BrandName,
        ItemName ,
        StoreName as Store1,
        Qty as Qty1,
        null as Store2,
        null  AS Qty2,
 where Stores.Id = 1
UNION ALL
SELECT  Id,
        SKU,
        BrandName,
        ItemName ,
        null as Store1,
        null as Qty1,
        StoreName as Store2,
        Qty as Qty2
 where Stores.Id = 3
)as x
     group by x.Id, etc...

因此,通过在查询中使用“虚拟”列,我可以返回几乎看起来像我想要的数据:

Id    | SKU       | Brand  | ItemName      | Store1    | Qty1 |Store2   | Qty2
------+-----------+--------+---------------+-----------+------+---------+-----
4441  | 15JE1215  | Ibanez | Metallic Grey | NULL      | NULL | Exeter  | 1
4441  | 15JE1215  | Ibanez | Metallic Grey | London    | 895  | NULL    | NULL 

我想将这两行合并为 1,即将 NULL 替换为另一行的值。我看着 PIVOT,但我的大脑融化了。

【问题讨论】:

  • 你不能在这里使用 FULL OUTER JOIN 而不是 UNION,例如加入上面示例的 Id、SKU、品牌、ItemName。完整的外部将处理只有一个商店具有该组列的条目的情况,但如果这种情况永远不会发生,您可以使用 INNER JOIN 代替。
  • 辛苦了。如果您将其添加为答案,我会将其标记为正确。

标签: sql-server-2008 pivot union


【解决方案1】:

编辑:提前道歉,因为我没有为您的问题提供“直接解决方案”,因为我觉得本着“教人钓鱼”的精神,您将从答案中受益更多。

就我个人而言,我会说您需要一个单独的商店表,然后创建一个“组”表,或者更好的是,有一个单独的库存表,列出每个产品的 SKU、它的位置等。

-------------- |信息 | -------------- - pRid - pSku - pName - pDesc -pImage -------------- | p股票 | -------------- - pRid - pSku - pStore - p状态

然后对每件商品进行核算,只需输入一个信息条目,即可与 SKU 的库存信息进行匹配和核对。

而不是 Store1 和 Store2,只使用“Stores”,并为库存表中的每个项目指定一个存储代码(如每个项目)。

如果您开设更多商店,您现在只需将另一条记录添加到 stores 表,而不是更改整个结构以添加“Store3”列。

使用这么多单独的表可能看起来很麻烦,但从长远来看它会容易得多,并且会使自动化变得非常容易。

类似地,我会使用一个仓库表,并整理这些信息来创建商店。

如果您真的想要这种类型的表结构,那么将表中的数据整理到一个新表中(如果这样可以让事情变得更容易的话)。

每日提示:将事物分解为原子形式,数据库将自行整理。还要明智地利用时间..

:)

【讨论】:

  • 感谢您的回答,但这正是我 确实 拥有的结构,我只是出于问题的目的简化了查询。如果您查看我的查询,我实际上已经从原始查询中留下了 Stores.Id
【解决方案2】:

用户内连接或左外连接

SELECT T1.Id, T1.SKU, T1.BrandName, T1.ItemName, ISNULL(T1.Store1,T2.Store1) As Store1
, ISNULL(T1.Qty1, T2.Qty1) AS Qty1, ISNULL(T1.Store2,T2.Store2) As Store2
,ISNULL(T1.Qty2, T2.Qty2) AS Qty2
FROM
(
       SELECT  Id,
        SKU,
        BrandName,
        ItemName ,
        StoreName as Store1,
        Qty as Qty1,
        null as Store2,
        null  AS Qty2,
   where Stores.Id = 1
) T1
INNER JOIN
(
    SELECT  Id,
        SKU,
        BrandName,
        ItemName ,
        null as Store1,
        null as Qty1,
        StoreName as Store2,
        Qty as Qty2
     where Stores.Id = 3
) T2 ON (T1.Id = T2.Id .. etc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多