2

異なるセカンダリ ID を持ちながら、ID を共有する重複した行を表示している既存のクエリを変更しようとしています。

SELECT  IM.*, C.Client, U.Name, R.FrequencyUnit, R.FrequencyDuration, R.RIID
FROM    itemsMisc IM
LEFT JOIN Clients C on C.ClientID = IM.ClientID
LEFT JOIN Users U on U.UserID = IM.UserID
LEFT JOIN Recurringitem R ON (R.ClientID = C.ClientID AND IM.Rate = R.Rate AND IM.Title = R.Title)
WHERE   (IM.CID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#CID#">) 
  AND   (IM.Invoiced = 0)
ORDER BY IM.DateCompleted ASC;

何が起こっているかというと、同じユーザーが 2 つの同様の繰り返しアイテムを作成すると、(itemsMisc からの) 同じ IMID で重複した行が表示されますが、Recurringitems からの RIID は異なります。

IMID で GROUP BY を試してみたところ、選択したすべての項目を GROUP BY に含める必要があることがわかりました。

SELECT IM.IMID, IM.UserID, IM.ClientID, IM.Rate, IM.Title, IM.CID, IM.QTY, IM.DateCompleted, C.Client, U.Name, R.FrequencyUnit, R.FrequencyDuration, R.RBID
FROM    ItemMisc IM
LEFT JOIN Clients C on C.ClientID = IM.ClientID
LEFT JOIN Users U on U.UserID = IM.UserID
LEFT JOIN Recurringitem R ON (R.ClientID = C.ClientID AND IM.Rate = R.Rate AND IM.Title = R.Title)
WHERE   (IM.CID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#CID#">) 
  AND   (IM.Invoiced = 0)
GROUP BY IM.IMID, IM.UserID, IM.ClientID, IM.Rate, IM.Title, IM.CID, IM.QTY, IM.DateCompleted, C.Client, U.Name, R.FrequencyUnit, R.FrequencyDuration, R.RBID
ORDER BY IM.DateCompleted ASC;

何か明確にできることがあれば教えてください。

前もって感謝します

4

1 に答える 1

1

いくつかのオプションがあります

  • and句R.RBIDから削除できますselectgroup by
  • Rate、Title、FrequencyUnit、FrequencyDuration に一意のキーを作成して、「類似のアイテム」を取得しないようにします
  • Rate、Title、FrequencyUnit、FrequencyDuration ごとに 1 つの R.RBID のみを取得します

必要な最後のものである場合は、row_number を使用して、(rate、title、frequencyunit、および frequencyduration) ごとに 1 つだけの RBID を取得できます。

WITH cte 
     AS (SELECT IM.imid, IM.userid, IM.clientid, IM.rate, 
                IM.title, IM.cid,  IM.qty, IM.datecompleted, 
                C.client, U.name, R.frequencyunit, R.frequencyduration, 
                R.rbid, 
                Row_number() 
                  OVER ( 
                    partition BY R.rate, R.title, R.frequencyunit, R.frequencyduration 
                    ORDER BY R.rbid ) rn 
         FROM   itemmisc IM 
                LEFT JOIN clients C 
                       ON C.clientid = IM.clientid 
                LEFT JOIN users U 
                       ON U.userid = IM.userid 
                LEFT JOIN recurringitem R 
                       ON ( R.clientid = C.clientid 
                            AND IM.rate = R.rate 
                            AND IM.title = R.title ) 
        WHERE   (IM.CID = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#CID#">) 
            AND   (IM.Invoiced = 0)
         GROUP  BY IM.imid, IM.userid, IM.clientid, IM.rate, 
                   IM.title, IM.cid, IM.qty, IM.datecompleted, 
                   C.client, U.name, R.frequencyunit, R.frequencyduration, 
                   R.rbid) 
SELECT * 
FROM   cte 
WHERE  rn = 1 
ORDER  BY im.datecompleted ASC 

注: のメンバーを変更することで、「類似アイテム」を定義できます。partition BY

于 2013-03-14T21:49:35.480 に答える