1

平日を返すクエリがあります

Select PERSON_NAME, PERSON_DAY from PERSON_DAYS WHERE PERSON_ID = @myId

私が得ると言う

John 1 (mo)
John 3 (mo tu)
John 8 (th)

忙しい日はジョンのために手に入れる必要があります。このクエリのPERSON_DAY列で論理ORを実行するにはどうすればよいですか?

結果は11(mo tu th)になります

4

4 に答える 4

4

さて、ここまでで私のベスト

;with PowersOf2
as
(
    select 1 as Number
    union all
    select A.Number * 2 from PowersOf2 as A where A.Number < 64
)
select P.PERSON_NAME, sum(distinct P.PERSON_DAY & PowersOf2.Number)
from PERSON_DAYS as P
    left outer join PowersOf2 on PowersOf2.Number <= P.PERSON_DAY
where P.PERSON_ID = @myId
group by P.PERSON_NAME

SQL フィドルの例

于 2012-11-22T18:38:01.543 に答える
1

Roman の CTE に「触発された」: (最初の CTE はデモ データを生成するだけであることに注意してください)

with p as 
(
    select 'John' as PERSON_NAME, 1 as PERSON_DAY
    union
    select 'John', 3 
    union
    select 'John', 8
    union
    select 'Jane', 2
    union
    select 'Jane', 4
),
cte as
(
    select PERSON_NAME, PERSON_DAY from p
    union all
    select cte2.PERSON_NAME, p.PERSON_DAY | cte2.PERSON_DAY 
        from p 
        inner join cte as cte2 on p.PERSON_NAME = cte2.PERSON_NAME 
        where p.PERSON_DAY & cte2.PERSON_DAY = 0
)   
select PERSON_NAME, MAX(PERSON_DAY) from cte
group by PERSON_NAME
于 2012-11-22T19:15:38.013 に答える
1

私があなたを正しく理解していれば、ビットごとの演算子 andと集計関数の組み合わせを使用して、必要sumなことを行うことができます。

例:

with person_days as (
      select 'John' as person_name, 1 as weekday --mo
union select 'John',  3  -- mo, tu
union select 'John',  8  -- th
union select 'Jane',  1  -- mo
union select 'Jane',  9  -- mo, th
union select 'Jane', 40  -- th, sa
),
Bits AS ( 
          SELECT   1 AS BitMask --mo
UNION ALL SELECT   2            --tu
UNION ALL SELECT   4            --we
UNION ALL SELECT   8            --th
UNION ALL SELECT  16            --fr
UNION ALL SELECT  32            --sa
UNION ALL SELECT  64            --su
UNION ALL SELECT 128
)
, person_single_days as (
select distinct person_name, weekday & bits.BitMask single_weekday
  from person_days 
       inner join bits on person_days.weekday & bits.BitMask > 0
)
select person_name, sum(single_weekday) weekdays
  from person_single_days
 group by person_name;

結果:

person_name weekdays
----------- -----------
Jane        41
John        11
于 2012-11-22T18:53:38.743 に答える
0

あなたが探しているのは、OR を行うカスタム集計だと思います。.NET で SQL CLR を使用して記述できます。これはおそらく最もクリーンなソリューションです。こちらも再利用になります。

または、カーソルベースのループを使用して結果を計算することもできます。

この目的で CTE を (誤) 使用することもできます。

于 2012-11-22T18:46:42.607 に答える