在SQL中使用按位运算将多个列转换为单个整数

时间:2013-04-28 00:07:49

标签: sql sql-server

我有数千行描述某些产品的表格。它有多个关于产品功能的专栏。例如,

productid productname isOnSale HasVeteranDiscount IsTaxExempt Otherdata1 Otherdata2 ...
1         rice        0                  1        1          info1      info2
2         camera       1        0                   0         info3      info4

另一张表

[Productparts]
Partid parentproductid isGeneric CanBeSoldSeperate OtherData1 Otherdata2 ...

另一张表:

ProductId ItemsSold Datesold
1          23        4/20/2013   

我有一个描述productfeature的枚举:

[Flags]
public enum ProductFeature : short
{
    None = 0,
    isOnSale = 0x001,
    HasVeteranDiscount = 0x002, 
    IsTaxExempt = 0x004, 
    isGeneric = 0x008, 
    CanBeSoldSeperate = 0x010,
}

对于统计分析,我需要将三个表中的上述数据插入一个表中,作为所有适用产品功能的按位或整数,其中包含属于该类别的产品数量以及产品销售计数,例如:

ProductTrend
ProductFeatures ItemsSold MonthSold

例如,如果产品是非常规的并且具有一个或多个通用的部件并且具有可以单独出售的一个或多个部件,则其为25。 而另一种产品有相同数量,并且有一个或多个零件可以单独出售,然后是18 [HasVeteranDiscount | CanBeSoldSeperate = 18] 我的表应该如下:

ProductTrend
ProductFeatures ItemsSold MonthSold
25              34        April
18              12        May

我需要帮助的最重要的部分是如何将多个表中多列的产品数据组合成一个具有按位运算的整数列productFeatures。

2 个答案:

答案 0 :(得分:3)

SQL Server支持|按位或:

select  productid
,       productname
,       case when isOnSale = 1 then 1 else 0 end |
        case when HasVeteranDiscount = 1 then 2 else 0 end |
        case when IsTaxExempt = 1 then 4 else 0 end as Flags
from    Table1

Example on SQL Fiddle.

答案 1 :(得分:1)

试试这个,sample here

    select productid,intheMonthOf,features,sum(itemsold) as TotalSoldItems 
   from (

    select  a.productid,Datename(month,datesold) as intheMonthOf, itemsold,

    case when a.isonsale =1 then 1 else 0 end |
    case when a.hasveterrandiscount =1 then 2 else 0 end  |
    case when a.istaxexempt =1 then 4 else 0 end |
    case when b.isgeneric =1 then 8 else 0 end |
    case when b.canbesoldseparate =1 then 10 else 0 end as features

     from t1 a
    left outer join t2  b on a.productid=b.parentproductid
    inner join t3 c on c.porductid=a.productid )main
    group by productid,intheMonthOf,features