2

曜日のデータを格納するテーブルがあります。テーブルにその曜日の行がない場合でも、各曜日の行を返したいのですが。これが私の現在のsqlselectステートメントです。

SELECT StoreID,
   CASE 
       WHEN S.[DayOfWeek] = 1 THEN 'Sunday' 
       WHEN S.[DayOfWeek] = 2 THEN 'Monday'
       WHEN S.[DayOfWeek] = 3 THEN 'Tuesday'
       WHEN S.[DayOfWeek] = 4 THEN 'Wednesday'
       WHEN S.[DayOfWeek] = 5 THEN 'Thursday'
       WHEN S.[DayOfWeek] = 6 THEN 'Friday'
       WHEN S.[DayOfWeek] = 7 THEN 'Saturday'
       ELSE 'BAD' 
   END AS [DayOfWeek], 
       isOpen
  FROM MyTable S
 WHERE StoreID = @I_StoreID
 ORDER BY S.[DayOfWeek]  

現在、テーブルに存在するのはそれだけなので、月曜日と火曜日のレコードだけが返されますが、現在レコードがない場合でも、他の行も返すようにします。ありがとう!

編集:

これが私が持っているものです...

  StoreID | DayOfWeek | isOpen

      22     Sunday      0
      22     Monday      1
      29     Sunday      0

これが私が手に入れたいと思っているものです...

  StoreID | DayOfWeek | isOpen

      22     Sunday      0
      22     Monday      1
      22     Tuesday     NULL
       ....
      22     Saturday    NULL

      29     Sunday      1
      29     Monday      NULL 
      29     Tuesday     NULL
       ....
      29     Saturday    NULL
4

3 に答える 3

4

このソリューションを使用できます:

SELECT
    a.StoreID,
    a.weekdayname,
    b.isOpen
FROM
(
    SELECT *
    FROM
    (
        SELECT DISTINCT StoreID
        FROM MyTable
    ) aa
    CROSS JOIN
    (
        SELECT 1 AS weekdaynum, 'Sunday' AS weekdayname UNION ALL
        SELECT 2, 'Monday'                UNION ALL
        SELECT 3, 'Tuesday'               UNION ALL
        SELECT 4, 'Wednesday'             UNION ALL
        SELECT 5, 'Thursday'              UNION ALL
        SELECT 6, 'Friday'                UNION ALL
        SELECT 7, 'Saturday'
    ) bb
) a
LEFT JOIN
    MyTable b ON a.StoreID = b.StoreID AND 
                 a.weekdaynum = b.[DayOfWeek]
WHERE
    a.StoreID = @I_StoreID
ORDER BY
    a.StoreID, a.weekdaynum

ここでは、すべての曜日名を手動で選択CROSS JOINし、それぞれ異なるStoreID. FROM次に、その選択の結果を句にラップし、曜日番号が一致するLEFT JOINという条件でメイン テーブルに戻ります。StoreIDそうでない場合、isOpenフィールドは になりますNULLが、StoreID対応する曜日は引き続き表示されます。


SQLFiddle デモ

于 2012-07-30T01:45:05.897 に答える
2

isOpen が開く場合は 1、閉じる場合は 0 の場合、実行できる可能性があります

select StoreID,
   max(case when s.[DayOfWeek] = 1 then isOpen else 0 end) as Sunday,
   max(case when s.[DayOfWeek] = 2 then isOpen else 0 end) as Monday,
   max(case when s.[DayOfWeek] = 3 then isOpen else 0 end) as Tuesday,
   max(case when s.[DayOfWeek] = 4 then isOpen else 0 end) as Wednesday,
   max(case when s.[DayOfWeek] = 5 then isOpen else 0 end) as Thursday,
   max(case when s.[DayOfWeek] = 6 then isOpen else 0 end) as Friday,
   max(case when s.[DayOfWeek] = 7 then isOpen else 0 end) as Saturday
from MyTable S
where StoreID = @I_StoreID
group by StoreID

これにより、クエリの形式が変更されますが、曜日ごとに 1 つの列が表示され、その日に店舗が開いているかどうかが表示されます。

于 2012-07-30T01:39:23.050 に答える
1

編集:更新された応答を見る前に、これを変更しました。見たいデータがあれば、他の答えがうまくいくはずです。

DayOfWeek を持つ MyTable から独立したテーブルはありますか? テーブル全体に DayOfWeek = 1 のレコードが 1 つもない場合は、MyTable の使用を開始する前に、別の DayOfWeek テーブルを使用してこれらの値を一覧表示する必要があります。

以下は、架空の DayOfWeek テーブルと、結果として得られる SQL です。

DayOfWeek テーブル
DayOfWeek : 名前
1 : 日曜日
2 : 月曜日
3 : 火曜日
4 : 水曜日
5 : 木曜日
6 : 金曜日
7 : 土曜日

クエリ

SELECT D.Name,
S.isOpen,
COUNT(S.StoreID) as StoreID_Count
FROM DayOfWeek D
LEFT OUTER JOIN MyTable S ON S.DayOfWeek = D.DayOfWeek
WHERE S.StoreID = @I_StoreID
GROUP BY D.[DayOfWeek], S.isOpen
ORDER BY D.[DayOfWeek]

これにより、少なくともあなたを近づけるべきだと思います。

于 2012-07-30T01:26:52.433 に答える