Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server在逻辑上添加字符串(0,1)_Sql_Sql Server - Fatal编程技术网

SQL Server在逻辑上添加字符串(0,1)

SQL Server在逻辑上添加字符串(0,1),sql,sql-server,Sql,Sql Server,我有一个表(我们称之为AAA),其中我的4个通道ID中的每一个都有自己的专用publish flag列,这是一个由0、1组成的字符(4) 这里有一个例子 on_date rate_id type_id channel_id publish_flag 2016-02-08 00:00:00.000 98 1 1 1000 2016-02-08 00:00:00.000 98 1 2

我有一个表(我们称之为AAA),其中我的4个通道ID中的每一个都有自己的专用
publish flag
列,这是一个由0、1组成的字符(4)

这里有一个例子

on_date                 rate_id type_id channel_id  publish_flag
2016-02-08 00:00:00.000 98      1       1           1000
2016-02-08 00:00:00.000 98      1       2           0100
2016-02-08 00:00:00.000 98      1       4           0000
2016-02-08 00:00:00.000 98      2       1           1000
2016-02-08 00:00:00.000 98      2       2           0100
2016-02-08 00:00:00.000 98      2       3           0001
2016-02-08 00:00:00.000 98      2       4           0000
我想把结果分组

  • 日期(在本例中为2016-02-08 00:00:00.000 98)
  • rate_id(在本例中为98)
  • 类型_id(在本例1和2中)
  • 并使用“逻辑添加”发布标志列,而不是通道_id
上述转换的示例:

on_date                 rate_id type_id     publish_flag
2016-02-08 00:00:00.000 98      1           1100    
2016-02-08 00:00:00.000 98      2           1101
所以对于第一组:

1000   +
0100   +
0000   =
--------
1100
1000   +
0100   +
0001   +
0000   =
--------
1101
第二组:

1000   +
0100   +
0000   =
--------
1100
1000   +
0100   +
0001   +
0000   =
--------
1101
在MS SQL Server 2008R2中,有什么技巧可以实现上述目标吗


谢谢

据我所知,您需要每个位置的最高位。 试试这个:

SELECT 
  on_date,rate_id,type_id,
  MAX(substring(publish_flag, 1,1)) + MAX(substring(publish_flag, 2,1)) + 
  MAX(substring(publish_flag, 3,1)) + MAX(substring(publish_flag, 4,1)) as publish_flag
FROM YourTable
GROUP BY on_date,rate_id,type_id

据我所知,每个位置都需要最高位。 试试这个:

SELECT 
  on_date,rate_id,type_id,
  MAX(substring(publish_flag, 1,1)) + MAX(substring(publish_flag, 2,1)) + 
  MAX(substring(publish_flag, 3,1)) + MAX(substring(publish_flag, 4,1)) as publish_flag
FROM YourTable
GROUP BY on_date,rate_id,type_id

我改进了文本格式,但仍然不理解你所说的逻辑加法是什么意思。如果你有一个0010+0011怎么办?它是0101还是0021?一个常规的总和可以用你的例子吗?二进制
0010+0011=0101
除非你的意思是
,然后
0010或0011=0011
理想情况下,改变你的数据库设计。在一列(对于一行)中存储多个值通常只是存储将来在维护和查询数据时出现的问题的一种方式。我改进了文本格式,但仍然不理解逻辑加法的含义。如果您有0010+0011怎么办?它是0101还是0021?一个常规的总和可以用你的例子吗?二进制
0010+0011=0101
除非你的意思是
,然后
0010或0011=0011
理想情况下,改变你的数据库设计。在一列(对于一行)中存储多个值通常只是存储将来在维护和查询数据时遇到的问题的一种方法。这是一个多么聪明和简单的想法啊!我觉得它很有魅力!多么聪明和简单的想法!我觉得它很有魅力!