是否可以隐藏所有重复数据行?

时间:2019-04-04 22:23:28

标签: sql reporting-services

我正在使用我创建的SQL存储参数来构建报告。它提取的数据可能是每个唯一编号1行,或者每个唯一编号2行。我只想显示只有1行的行。

我尝试了更改可见性,但是最接近的是

=IIF(Fields!uniquenumber.Value = previous(Fields!uniquenumber.value,True,False) 

但是这隐藏了其中的一行,但不是全部。我还尝试在查询中使用CASE WHEN来识别是否有多于1行,但是当多于1行时,我仍然无法隐藏。我的查询如下(删除了很​​多与我的问题无关的额外条件。在很多情况下,我的WHERE语句的第一部分将包含也符合第二部分条件的数据。

SELECT
    Reorders.LastRxNo,
    Reorders_1.LastRxNo AS Reorders1LastRxNo,
    Rxs_2.RxBatch AS Rxs2RxBatch,
    Reorders.FacID,
    KeyIdentifiers.GPI,
    Reorders.LastFillDt,
    Rxs_1.RxBatch as Rxs1RxBatch,
    CASE 
        WHEN (Reorders.LastRxNo<>Reorders_1.LastRxNo) THEN 1
        ELSE 0
    END AS Duplicate

FROM Reorders
  LEFT OUTER JOIN Rxs AS Rxs_1
    ON Reorders.LastRXNo = Rxs_1.RxNo
  RIGHT OUTER JOIN KeyIdentifiers
    ON Reorders.NDC = KeyIdentifiers.NDC
  INNER JOIN Patients
    ON Reorders.FacID = Patients.FacID
    AND Reorders.PatID = Patients.PatID
  LEFT OUTER JOIN Reorders AS Reorders_1
    ON Reorders.FacID = Reorders_1.FacID
    AND Reorders.PatID = Reorders_1.PatID
    AND KeyIdentifiers.NDC = Reorders_1.NDC
  LEFT OUTER JOIN Rxs AS Rxs_2
    ON Reorders_1.LastRxNo = Rxs_2.RxNo

WHERE       
        Reorders.ProfileOnly = 1
    AND Rxs_1.RxBatch IS NULL
    AND Reorders.CutOffDt IS NULL
    AND Reorders.PackType LIKE 'PHDEF%'
    AND Reorders.Auto = 1
    AND Reorders.PhRxStatus IS NULL
    AND Reorders.LastFillDt > '01/01/2019'
    AND (Reorders.LastRxNo = Reorders_1.LastRxNo
         OR Reorders.LastRxNo <> Reorders_1.LastRxNo AND Rxs_2.RxBatch IN ('CF','GONE'))

ORDER BY Reorders.FacID, Patients.PatLName, Patients.PatFName

产量类似于:

LastRxNo     Reorders1LastRxNo     Rxs2RxBatch    Duplicate             
111          111                   null            0
222          222                   null            0
222          444                   CF              1

在上面的示例中,我只需要看到类似于第1行的行。由于“ LastRxNo” 222有2行,因此我不想在最终报告中看到它。 (但是,由于如果LastRxNo = 222 AND Reorders1LastRxNo = 222并且Rxs2RxBatch IS NULL,如果我不在WHERE语句中说明这一点,它将被拉出。我想。我很乐意这样做,无论是在查询中或在SSRS报告中。

3 个答案:

答案 0 :(得分:0)

仅过滤掉行数大于1的所有行。

SELECT LastRxNo, RxBatch
FROM Reorders
WHERE RxBatch IN ('CF','GONE')
AND Reorders.LastRxNo IN
    (SELECT LastRxNo FROM Reorders GROUP BY LastRxNo HAVING COUNT(LastRxNo) = 1)

您应该只能够将最后两行添加到WHERE子句中。

或者,您可以将其添加到JOIN条件中:

SELECT
Reorders.LastRxNo
FROM Reorders
INNER JOIN (
    SELECT LastRxNo FROM Reorders 
    GROUP BY LastRxNo 
    HAVING COUNT(LastRxNo) = 1
) AS UniqueRxNo ON UniqueRxNo.LastRxNo = Reorders.LastRxNo

答案 1 :(得分:0)

将您的CASE ...替换为

COUNT(*) OVER(PARTITION BY LastRxNo) AS LastRxNoCount

然后

将整个查询换成另一个这样的选择...

SELECT * FROM 
            (
            your original query here including the change stated above
             ) q
         WHERE q.LastRxNoCount =1

答案 2 :(得分:-1)

是的,您可以通过以下两种方式之一进行操作:

  1. 在您的数据源中,进行不同的选择。
  2. 在报表属性的详细信息行上设置“隐藏重复项”