0

この問題に対するクエリを書きたい:

1997 年 8 月に注文がなかった日を表示します。

注文があった日はわかりますが、注文がなかった日はどうすればわかりますか?

これは、注文が行われた日を示しています。

SELECT
   o.OrderID,
   day(o.OrderDate) AS 'Date',
   sup.CompanyName 
FROM
   Orders o 
   INNER JOIN OrderDetails od ON o.OrderID = od.OrderID 
   INNER JOIN Products p ON od.ProductID = p.ProductID 
   INNER JOIN Suppliers sup ON p.SupplierID = sup.SupplierID 
WHERE
   sup.CompanyName = 'Tokyo Traders'
   AND o.OrderDate BETWEEN '1/1/1997' AND '1/31/1997'
4

3 に答える 3

2

欠落している日付を見つけるために結合できる Date テーブルが必要です。

その SQL Server を想定すると、次のようになります。

これに対してクエリを結合して、結果を取得できます

WITH DatesTable
AS
(
  SELECT CAST('2007-08-01' as datetime) AS [date]
  UNION ALL
  SELECT DATEADD(dd, 1, [date])
  FROM DatesTable
  WHERE DATEADD(dd, 1, [date]) <= '2007-08-31'
)
SELECT [date] FROM DatesTable
OPTION (MAXRECURSION 0);

に似た何か

WITH DatesTable
AS
(
  SELECT CAST('2007-08-01' as datetime) AS [date]
  UNION ALL
  SELECT DATEADD(dd, 1, [date])
  FROM DatesTable
  WHERE DATEADD(dd, 1, [date]) <= '2007-08-31'
)
SELECT DT.[date]
FROM
   DatesTable DT 
   Left Outer Join Orders o on o.OrderDate = DT.[Date]

WHERE o.OrderDate is null

OPTION (MAXRECURSION 0);
于 2012-07-25T20:10:53.037 に答える
0

SQL Server の場合:

WITH Dts AS (
   SELECT DateAdd(day, V.number, '19970801') Dt
   FROM master.dbo.spt_values V
   WHERE V.type = 'P'
   AND V BETWEEN 1 AND 31
)
SELECT Dts.Dt
WHERE NOT EXISTS (
   SELECT *
   FROM
      Orders o 
      INNER JOIN Suppliers sup ON p.SupplierID = sup.SupplierID 
   WHERE
      sup.CompanyName = 'Tokyo Traders'
      AND Dts.Dt = o.OrderDat
)

Tokyo Traders注文のない日が必要だと思われるので、CompanyName にあなたの状態を残しました。

于 2012-07-25T20:15:26.363 に答える
0

これを行うクロスデータベースの方法は、各日付の行を含むテーブルを作成し、それを詳細テーブルに結合したままにすることです。null は、一致しない場所です。

于 2012-07-25T20:11:12.060 に答える