3

以下のクエリは、null されていないすべてのトランザクションを一覧表示するものです。目的は、すべての開かれたトランザクション ID (顧客注文を表す) とその請求番号を含むリストを取得することです。

Table 1
transactionID
bookdate
cost
year

Table 2
transactionID
invoice
year

SELECT 1.transactionID, Sum(cost), 1.Max(bookdate), 2.invoice
FROM 1
LEFT JOIN 2
ON 1.transactionID = 2. transactionID AND 1.year = 2.year
GROUP BY 1.transactionID, 2.invoice
HAVING (Sum(cost)<>0)

私の問題は、トランザクション ID が毎年再利用されることです。そのため、実際のトランザクション ID と表 2 の請求書の間で年が一致することを確認する必要があります。

すべての transactionID には、予約日が異なる複数のトランザクションがあります。これは、1 つのトランザクションが 2011 年と 2012 年に発生した可能性があることを意味します。クエリで、開いているトランザクション ID ごとに最も早い予約日に対応する年を検索する必要があります。

例えば:

表1

1 | 20120101 | -20  | 2012
2 | 20120501 | -100 | 2012
2 | 20110501 | 100  | 2012
1 | 20110801 | 50   | 2011

表 2

1 | invoice X   | 2012
2 | invoice Y   | 2012
1 | invoice old | 2011

結果は

1 | 30 USD | Invoice old
4

2 に答える 2

1

If you are using SQL Server 2005 or later version, you could use window functions like this:

WITH summedAndRanked AS (
  SELECT
    [1].transactionID,
    [2].invoice,
    totalCost    = SUM(cost)     OVER (PARTITION BY [1].transactionID),
    lastBookDate = MAX(bookdate) OVER (PARTITION BY [1].transactionID),
    rnk          = DENSE_RANK()  OVER (PARTITION BY [1].transactionID ORDER BY [1].year),
  FROM [1]
    LEFT JOIN [2]
      ON [1].transactionID = [2].transactionID
     AND [1].year = [2].year
)
SELECT DISTINCT
  TransactionID,
  totalCost,
  lastBookDate,
  invoice
FROM countedAndRanked
WHERE totalCost <> 0
  AND rnk = 1
;
于 2012-09-09T16:32:57.900 に答える
0

私はあなたがもうすぐそこにいると思います - 試してみてください

SELECT 1.transactionID, 1.Year, Sum(cost), Max(1.bookdate), 2.invoice 
FROM 1 
LEFT JOIN 2 
ON 1.transactionID = 2. transactionID AND 1.year = 2.year 
GROUP BY 1.transactionID, 1.Year, 2.invoice
HAVING (Sum(cost)<>0) 
于 2012-09-05T10:44:41.993 に答える