0

データベースのサイズが非常に大きいため、2 つの SQL クエリを 1 つに結合する必要があります (ほとんどの小売店の場所は問題ありませんが、トランザクションがはるかに多いものもあります)。

基本的に、特定の日の従業員あたりのトランザクション数が必要です。これを行うために、従業員ごとのトランザクション番号の個別の数を数えています (トランザクション内の各アイテムは、同じトランザクション番号を持つ独自の行を取得するため、個別である必要があります)。ただし、「txnvoidmod」という列があります。基本的には、この列の値が 0 の場合はトランザクションを通常どおりにカウントしますが、値が 1 の場合はトランザクションが実際に無効になっているため、1 を引く必要があります。

ここにいくつかのサンプルデータがあります

+------ -+------------+-------------+
|transnum| txnvoidmod | salesprsnid |
+--------+------------+-------------+
| 115568 | 0          | 1339        |
| 115568 | 0          | 1339        |
| 114566 | 0          | 1339        |
| 114566 | 0          | 1339        |
| 115504 | 0          | 2555        |
| 105551 | 0          | 0452        |
| 105551 | 0          | 0452        |
| 105551 | 0          | 0452        |
| 105552 | 1          | 0452        |
| 105552 | 1          | 0452        |
| 105552 | 1          | 0452        |
+--------+------------+-------------+

この例では不要なフィールドをいくつか省略しています。

これが私が使用しているクエリです

 select txn_pos_transactions.cashiernum as salesprsnid, 
    (count(distinct MS.transnum))as transcnt
    from Txn_Merchandise_Sale MS  
    INNER JOIN txn_pos_transactions ON MS.transnum=txn_pos_transactions.transnum 
    Where MS.modtime like '2013-06-01 %' AND MS.itemdatetime like '2013-06-01 %' 
    and (txnvoidmod=0 or txnvoidmod=1) 
    Group by txn_pos_transactions.cashiernum order by salesprsnid

このクエリが純売上高と販売台数もクエリしているという事実を除外しているので、それを考慮する必要があります。このクエリの結果の例 (省略された netsales と units の部分は非常に冗長です)

+------ -+------------+-------------+-------------+
|transcnt| unitssold  | salesprsnid | netsalesamt |
+--------+------------+-------------+-------------+
| 2      | 5          | 1339        | 98.50       |
| 1      | 2          | 2555        | 35.20       |
| 2      | 1          | 0452        | 24.00       |
+--------+------------+-------------+-------------+

上記から、ID「0452」の従業員は結果 (transcnt) に 2 つのトランザクションを持っていますが、1 つのトランザクションの txnvoidmod が 1 に等しく、実際には 0 トランザクションとして読み取られるようにクエリを作成する必要があります。 txnvoidmod=0 の前のトランザクションは無効です。where句で「txnvoidmod=0」とだけ言った場合、「0452」には1つのトランザクションがありますが、txnvoidmod=1のトランザクションを差し引く必要があります

条件分岐や txnvoidmod の値の減算など、さまざまなことを試しましたが、txnvoidmod でグループ化しようとして、不要な行が生成されるため、役に立ちませんでした。salesprsnid ごとに 1 つの行のみが必要です。

どんな提案も素晴らしいでしょう、ありがとう。

ところで、私は SAP Sybase データベースを使用しています。一部のアイテムが欠けていることを除けば、ほとんどのクエリは同じようです。

4

2 に答える 2

1

これはどう:

SELECT 
  txn_pos_transactions.cashiernum AS salesprsnid
  ,COUNT(DISTINCT CASE txnvoidmod WHEN 1 THEN MS.transnum END) AS transcnt
FROM Txn_Merchandise_Sale MS  
  INNER JOIN txn_pos_transactions ON MS.transnum = txn_pos_transactions.transnum 
WHERE MS.modtime LIKE '2013-06-01 %' 
  AND MS.itemdatetime LIKE '2013-06-01 %' 
  AND txnvoidmod IN(0, 1) 
GROUP BY txn_pos_transactions.cashiernum 
ORDER BY salesprsnid
于 2013-07-25T15:54:51.330 に答える