【问题标题】:T-SQL - Querying an Un-Normalized TableT-SQL - 查询未规范化的表
【发布时间】:2017-01-17 23:32:19
【问题描述】:

我有一个表“Purchases”,其中包含类似于这个简化示例的字段:

CustomerID  Item1   Price1   Item2   Price2   Item3   Price3  ... Item40  Price40
   111      15      26.00   23      5.00     31      2.75         36      17.50
   906      3        4.63   17       .77     18      3.74         19      22.60

项目/价格字段的全部、部分或没有值可能存在。 如果有物品,就会有价格。 项目始终按项目# 顺序输入。如果有 3 个项目,它们将位于前三个项目字段中...

我想将上面的表加入到另一个表 - 客户 - 具有客户 ID、姓名、地址、电子邮件......这样我就可以获得购买项目 15、17、18 和 36 的所有客户的列表。此时,我不想显示每个客户购买了哪些必需的物品。

如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: tsql


    【解决方案1】:

    另一个选项(动态较少但性能更高),但您必须列出 40 个项目字段

    Declare @YourTable table (CustomerID int,  Item1 int,   Price1 decimal(10,2),   Item2 int, Price2  decimal(10,2),   Item3 int, Price3  decimal(10,2), Item40 int, Price40  decimal(10,2))
    Insert into @YourTable values 
    (111,15,26.00,23,5.00,31,2.75,36,17.50),
    (906, 3, 4.63,17, .77,18,3.74,19,22.60)
    
    Select Distinct 
           A.CustomerID
     From  @YourTable A
     Cross Apply (Values (Item1)
                        ,(Item2)
                        ,(Item3)
                        -- ... Items 4 - 39
                        ,(Item40)
                 ) B (value)
    
     Where B.Value in (15,17,18,36)
    

    【讨论】:

    • 再次感谢@John Cappelletti!我赞扬你超越自我。我会尝试您的建议并做出回应。
    • 在我的问题标题中,我使用了“未标准化表”一词。这是对桌子设计的公平/正确评估吗?
    • @Talay 在我的脑海中,我认为它是一个 Unpivot
    • 这对我来说非常有效。谢谢!我也会尝试其他 [动态] 建议,但老实说,我觉得它令人生畏和令人费解!! :D
    • @Talay 很高兴它有帮助
    猜你喜欢
    • 2017-05-09
    • 2014-10-21
    • 1970-01-01
    • 2013-02-15
    • 2013-11-17
    • 2011-03-31
    • 2017-07-31
    • 2015-06-11
    • 2013-02-05
    相关资源
    最近更新 更多