2017-03-07 120 views
1

我有SQL Server 2014中使用的以下T-SQL代碼。在sql server中選擇前50行

此代碼會產生1000行。但是我只需要從頂端50行(來自供應商欄)。

在下面的代碼中,如果我使用SELECT Top 50 s.[CusNo] Supplier那麼我沒有得到想要的結果。

在下面的代碼中需要做什麼修改才能得到前50行(「供應商」列),而現有結果沒有任何變化。

SELECT s.[CusNo] Supplier, 
RTRIM(CAST(s.[Customer] AS VARCHAR(50))) AS Name, 
s.[ConcessionNo] Concession, 
RTRIM(CAST(s.[ConcessionName] AS VARCHAR(50))) AS ConcessionName, 

sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) - 1) and convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5) 
      then s.SELLINC else 0 end) ActualSales, 

    sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) -1 /* On 14/Feb/2021 modify +6 to -1 */) and convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5 /* On 14/Feb/2021 modify +12 to +5 */) 
      then s.SELLINC else 0 end) LastYrVariance, 

    (sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) - 1) and convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5) then s.SELLINC else 0 end))- 

    (sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) -1 /* On 14/Feb/2021 modify +6 to -1 */) and convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5 /* On 14/Feb/2021 modify +12 to +5 */) then s.SELLINC else 0 end)) LastYrVariancePounds, 

    (IsNull(sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) - 1) and convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5) 
      then s.SELLINC else 0 end)-sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) -1 /* On 14/Feb/2021 modify +6 to -1 */) and convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5 /* On 14/Feb/2021 modify +12 to +5 */) 
      then s.SELLINC else 0 end),0)/NullIf(sum(case when s.Date between convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) -1 /* On 14/Feb/2021 modify +6 to -1 */) and convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5 /* On 14/Feb/2021 modify +12 to +5 */) 
      then s.SELLINC else 0 end),0))*100 LastYrVariancePercentage, 


    sum(case when s.Date 
     BETWEEN   
      convert(varchar(10), DATEADD(day, DATEDIFF(day, '19000107', DATEADD(month, DATEDIFF(MONTH, 0, CONVERT(date, CONVERT(VARCHAR(4), (CASE WHEN MONTH(GetDate()) = 1 THEN CONVERT(VARCHAR(4), GetDate(), 112) - 1 ELSE CONVERT(VARCHAR(4), GetDate(), 112) END), 112) + '0101')), 30))/7 * 7, '19000107'), 120) 
     AND   
      Convert(date, dateadd(wk, datediff(wk, 0, GETDATE()) - 1, 0) + 5)  
      then s.SELLINC else 0 end) YrToDateActual, 


    sum(case when s.Date  
     BETWEEN 
      convert(varchar(10), DATEADD(day, DATEDIFF(day, '19000107', DATEADD(month, DATEDIFF(MONTH, 0, CONVERT(date, CONVERT(VARCHAR(4), (CASE WHEN MONTH(DATEADD(year,-1,GetDate())) = 1 THEN CONVERT(VARCHAR(4), DATEADD(year,-1,GetDate()), 112) - 1 ELSE CONVERT(VARCHAR(4), DATEADD(year,-1,GetDate()), 112) END), 112) + '0101')), 30))/7 * 7, '19000107'), 120) 
     AND 
      convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5 /* On 14/Feb/2021 modify +12 to +5 */) 
      then s.SELLINC else 0 end) LastYrToDateActual, 


    (sum(case when s.Date 
    BETWEEN   
      convert(varchar(10), DATEADD(day, DATEDIFF(day, '19000107', DATEADD(month, DATEDIFF(MONTH, 0, CONVERT(date, CONVERT(VARCHAR(4), (CASE WHEN MONTH(GetDate()) = 1 THEN CONVERT(VARCHAR(4), GetDate(), 112) - 1 ELSE CONVERT(VARCHAR(4), GetDate(), 112) END), 112) + '0101')), 30))/7 * 7, '19000107'), 120) 
     AND   
      Convert(date, dateadd(wk, datediff(wk, 0, GETDATE()) - 1, 0) + 5) 
      then s.SELLINC else 0 end)) 

    - 

    (sum(case when s.Date 
     BETWEEN 
      convert(varchar(10), DATEADD(day, DATEDIFF(day, '19000107', DATEADD(month, DATEDIFF(MONTH, 0, CONVERT(date, CONVERT(VARCHAR(4), (CASE WHEN MONTH(DATEADD(year,-1,GetDate())) = 1 THEN CONVERT(VARCHAR(4), DATEADD(year,-1,GetDate()), 112) - 1 ELSE CONVERT(VARCHAR(4), DATEADD(year,-1,GetDate()), 112) END), 112) + '0101')), 30))/7 * 7, '19000107'), 120) 
     AND 
      convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5 /* On 14/Feb/2021 modify +12 to +5 */) 
      then s.SELLINC else 0 end)) YrToDateVariancePounds, 


    ((IsNull  
     (     
      (sum(case when s.Date 
      BETWEEN   
      convert(varchar(10), DATEADD(day, DATEDIFF(day, '19000107', DATEADD(month, DATEDIFF(MONTH, 0, CONVERT(date, CONVERT(VARCHAR(4), (CASE WHEN MONTH(GetDate()) = 1 THEN CONVERT(VARCHAR(4), GetDate(), 112) - 1 ELSE CONVERT(VARCHAR(4), GetDate(), 112) END), 112) + '0101')), 30))/7 * 7, '19000107'), 120) 
     AND   
      Convert(date, dateadd(wk, datediff(wk, 0, GETDATE()) - 1, 0) + 5) 
      then s.SELLINC else 0 end)) 

    - 

    (sum(case when s.Date 
     BETWEEN 
      convert(varchar(10), DATEADD(day, DATEDIFF(day, '19000107', DATEADD(month, DATEDIFF(MONTH, 0, CONVERT(date, CONVERT(VARCHAR(4), (CASE WHEN MONTH(DATEADD(year,-1,GetDate())) = 1 THEN CONVERT(VARCHAR(4), DATEADD(year,-1,GetDate()), 112) - 1 ELSE CONVERT(VARCHAR(4), DATEADD(year,-1,GetDate()), 112) END), 112) + '0101')), 30))/7 * 7, '19000107'), 120) 
     AND 
      convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5 /* On 14/Feb/2021 modify +12 to +5 */) 
      then s.SELLINC else 0 end)) 

      ,0) 

    ) 

    /

    (NullIf 
     (
     sum(case when s.Date 
      BETWEEN 
      convert(varchar(10), DATEADD(day, DATEDIFF(day, '19000107', DATEADD(month, DATEDIFF(MONTH, 0, CONVERT(date, CONVERT(VARCHAR(4), (CASE WHEN MONTH(DATEADD(year,-1,GetDate())) = 1 THEN CONVERT(VARCHAR(4), DATEADD(year,-1,GetDate()), 112) - 1 ELSE CONVERT(VARCHAR(4), DATEADD(year,-1,GetDate()), 112) END), 112) + '0101')), 30))/7 * 7, '19000107'), 120) 
     AND 
      convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5 /* On 14/Feb/2021 modify +12 to +5 */) 
      then s.SELLINC else 0 end)   

     ,0)))*100 LastYrToDateVariancePercentage 

FROM [dbo].[CustomerReports] s 
WHERE s.BRN = 1 or s.BRN = 2 or s.BRN = 3 or s.BRN = 4 or s.BRN = 5 or s.SELLINC is null or s.SELLINC = '0' 
GROUP BY s.[CusNo], s.[Customer], s.ConcessionNo, s.ConcessionName 
order by YrToDateActual desc 

當我在SSRS中運行此查詢時,我得到下面的結果(這是正確的)。但顯示所有數據。

enter image description here

如果我使用SELECT TOP 50秒。[CusNo]供應商(代碼休息是一樣的)然後我得到下面,

enter image description here

所以,請參閱突出部分在這兩個圖像。當我在SQL代碼中添加Top 50時,第2張圖片中不存在第1張圖片中出現的幾行(第3列)。

+0

請參閱我對您的其他問題的回答:http://stackoverflow.com/a/42652957/1593840 – Will

回答

0

試試這個:

With cte as (**your long query goes here**) 
Select Top(50) * From cte 
0

排序順序在查詢是YrToDateActual desc,所以TOP 50是給你最高的50個YrToDateActual金額。您的SSRS報告是按供應商編號和名稱對進行分組,但通過這兩列中的任何一個,看起來都不是排序,所以我猜測這些供應商的訂單在SSRS輸出中有些隨機。在這種情況下,我認爲你永遠無法獲得原始SSRS輸出的前50行。您可以做的最好的方法是您的SSRS輸出(例如按供應商編號),然後將此類排序添加到您的查詢中(order by Supplier, YrToDateActual desc)。將TOP 50添加到查詢中會在前50個結果後切斷新的排序SSRS輸出。

+0

謝謝,我現在會嘗試 – user2331670

+0

沒有它的不工作仍然是同一個問題 – user2331670

0

你想在報告中看到什麼?您是否希望根據總價值(例如Actual£Total)以及所有讓步(按照您的第一張截圖)查看前50名供應商?

如果是這樣,您將需要按供應商的總量排列並選擇排名爲50或以下的供應商。

下面是一個非常簡單的示例,可能有所幫助。在這裏,我使用了SUM()OVER()而不是使用GROUP BY,但這意味着您可能想要根據需要將SELECT更改爲SELECT DISTINCT,因爲您將獲得大量重複行。很明顯,這並沒有得到你冗長的案例陳述,但你應該能夠很容易地適應它。

SELECT * FROM 
    (
     SELECT 
      x.* 
      , DENSE_RANK() OVER(ORDER BY SupplierTotal DESC) as SupplierRank 
      , DENSE_RANK() OVER(PARTITION BY SupplierID ORDER BY ConcessionTotal DESC) as ConcessionRank 
     FROM 
      ( SELECT DISTINCT 
      SupplierID, ConcessionID, MyOtherRequiredColumns, 
      SUM(myValue) OVER(PARTITION BY SupplierID) AS SupplierTotal, 
      SUM(myValue) OVER(PARTITION BY SupplierID, ConcessionID) AS ConcessionTotal 
      FROM MyTable 
     ) x 
    ) z 
    WHERE SupplierRank <= 50 

這也將供應商排名中的讓步,這可能是有用的..

你也將不得不改變你彙報,你必須總結的值了(例如99389在實際£列)。不要總結下面的行,將表達式更改爲= FIRST(Fields!SupplierTotal。價值)