-1

私はこのテーブルを持っています

customer sunday monday tuesday wedesneday thursday friday saturday
1        0      0       1       1          1       0       0
2        0      1       0       0          0       0       1
3        0      0       1       0          1       0       1
4        0      0       1       1          0       1       0
5        0      1       0       0          1       1       1
6        0      0       1       0          1       1       0
7        0      1       0       1          1       0       1
8        0      0       0       0          1       1       0
9        0      1       1       1          0       0       1

今、私は次のパラメータを持っています> 1月、2月、3月(または任意のユーザーが選択)の年と月の スケジュールされた訪問は月ごとにどのようになりますか?

注:毎月、正確に日曜日で開始したり土曜日で終了したりすることはできません。また、モンは同じ数量の日数を持っていません。

ユーザーが選んだ毎月の初日と最終日が取れたと思います

ループと選択を使用してdatepart>datepart(weekday、 '1 /'+(some month)+'\' + year_choosed_by_user)

私はそれとして何かを得ることができると信じています

month, startday, lastday, days
1        0         2       31
2        3         3       29
3        4         6       30

ここで、0 =日曜日、6 =土曜日ですが、役に立ちますか?datepartを使用してこの#tmptableを取得します

4

2 に答える 2

5

あなたが何をしようとしているのか正確にはわかりませんが、以下の解決策は、日付のリストを作成し、UNPIVOT既存のデータを作成してから、毎月の予定数を取得します。

;with dates (datevalue) as
(
  select cast('2012-10-01' as datetime)
  union all
  select dateadd(d, 1, datevalue)
  from dates
  where dateadd(d, 1, datevalue) <= cast('2012-12-01' as datetime)
) 
select count(*) TotalAppts, datename(month, d.datevalue) [Month]
from dates d
inner join 
(
  select client, value, col
  from yourtable
  unpivot
  (
    value
    for col in (Sunday, Monday, Tuesday, Wednesday, 
                Thursday, Friday, Saturday)
  ) unpiv
) src
  on datename(dw, d.datevalue) = col
where value = 1
group by datename(month, d.datevalue)

デモで SQL Fiddle を参照してください

結果:

| TOTALAPPTS |    MONTH |
-------------------------
|          5 | December |
|        122 | November |
|        125 |  October |
于 2012-11-30T18:42:27.120 に答える
0

ある種のビットマスクを使用するとよいでしょう。たとえば、曜日に2進数に従って値を割り当てます。

Sunday     1
Monday     2
Tuesday    4
Wednesday  8
Thursday  16
Friday    32
Saturday  64

そして、その年の何ヶ月も同じです:

January       1
February      2
March         4
April         8
May          16
June         32
July         64
August      128
September   256
October     512
November   1024
December   2048

テーブル構造では、次のように3つの列のみが必要です。

customer_id (INT)  days (INT)   months (INT)
1                  28           0
2                  66           0
3                  84           0

顧客1は火曜日、水曜日、木曜日に訪問します。上記の例に示すように、これらの値は28に等しくなります。曜日の任意の組み合わせについて、2進数の加算により、結果の数値は一意になります。整数28を分解すると、次の2形式になります。

00011100

最後の7つの場所だけを考慮すると、1値は複数の列と同じように火曜日、水曜日、木曜日に対応します。

では、これはどのように役立ちますか?ビット演算子を使用してクエリを作成できます。

たとえば、月曜日に顧客が何を訪問するかを決定する必要がある場合はOR、その値が2である日列を確認する必要があります。

5月と6月に訪問する顧客の場合、値48を使用します。

この提案は、列の数を減らしてクエリを単純化するのに役立つ場合がありますが、何を求めているのか100%わかりません。

于 2012-11-30T18:28:46.850 に答える