Как я могу удалить результат группы sql - PullRequest
0 голосов
/ 09 мая 2019

У меня есть запрос SQL, но он дает мне больше результатов, которые я хочу. Например, при выполнении запроса я получу 20 результатов из 2 продуктов. Каждый продукт имеет group by, а group by g.linkedline должен игнорироваться и не показываться в результатах.

Это запрос, который у меня есть

Я пытался сделать select над моим select. Я также попробовал TOP 1, но это дает мне 1 результат.

    SELECT i.itemcode, 
       g.warehouse, 
       Sum(g.aantal) AS Voorraad, 
       Max(CASE 
             WHEN g.transtype = 'N' THEN g.sysmodified 
             ELSE NULL 
           END)      AS LastDate 
FROM   dbo.gbkmut AS g 
       INNER JOIN dbo.items AS i 
               ON g.artcode = i.itemcode 
                  AND g.reknr = i.glaccountdistribution 
                  AND ( g.transtype = 'N' 
                         OR ( g.transtype = 'B' 
                              AND g.transsubtype = 'B' 
                              AND g.freefield1 NOT IN ( 'B', 'Q', 'W', 'K' ) 
                              AND g.blockitem = '0' 
                              AND g.allocationtype = 'F' ) 
                         OR ( g.transtype = 'B' 
                              AND g.transsubtype = 'B' 
                              AND g.freefield1 = 'V' 
                              AND g.allocationtype = 'B' ) ) 
WHERE  g.transtype = 'N' 
       AND ( i.itemcode = 'TESTARTIKEL' 
              OR i.itemcode = 'IQ7-60-2-INT' ) 
GROUP  BY i.itemcode, 
          g.warehouse, 
          g.linkedline 

Ответы [ 4 ]

1 голос
/ 09 мая 2019

Я бы попробовал это так, вы можете использовать оконную функцию row_number для принудительного ранжирования.Если вас интересует только 1 вещь на уникальный код товара или дом, вы заменяете интересующую вещь в предложении Partition by, а затем указываете, что вы хотите заказать, в предложении order by.Например, в приведенном ниже запросе интересующий элемент представляет собой ItemCode, и мы размещаем заказы на складе и на складе (я предполагаю, что вы хотите видеть элементы с большим количеством записей, чем меньше, но вы можете удалить desc, если вам это подходит.потребности.

select * from
(
SELECT row_number()over(partition by i.Itemcode order by g.warehouse, g.aantal desc) as rowno, i.ItemCode, g.warehouse, SUM(g.aantal) AS Voorraad, MAX(CASE WHEN g.transtype = 'N' THEN g.sysmodified ELSE NULL END) AS LastDate
FROM    dbo.gbkmut AS g INNER JOIN  dbo.Items AS i
        ON g.artcode = i.ItemCode AND g.reknr = i.GLAccountDistribution AND (
                                                g.transtype = 'N' OR
                                                (g.transtype = 'B' AND 
                                                g.transsubtype = 'B' AND 
                                                g.freefield1 NOT IN ('B', 'Q', 'W', 'K') AND 
                                                g.BlockItem = '0' AND 
                                                g.AllocationType = 'F') OR ( g.transtype = 'B' AND g.transsubtype = 'B' AND g.freefield1 = 'V' AND g.AllocationType = 'B'))
WHERE g.transtype = 'N' AND (i.ItemCode = 'TESTARTIKEL' OR i.ItemCode = 'IQ7-60-2-INT') GROUP BY i.ItemCode, g.warehouse, g.LinkedLine 
) x where rowno=1;
0 голосов
/ 09 мая 2019

Я нашел проблему. спасибо всем!

В Воррааде был отчёт, поэтому результат был неверным.

Это код

select * from
(
SELECT 
    i.ItemCode, 
    g.warehouse, 
    SUM(g.aantal) AS Voorraad, 
    MAX(CASE 
        WHEN g.transtype = 'N' THEN g.sysmodified 
        ELSE NULL 
    END) AS LastDate,
    row_number()
        over
            (partition by 
                i.Itemcode 
                order by 
                    g.warehouse 
                    ) as rowno
FROM    dbo.gbkmut AS g 
    INNER JOIN  dbo.Items AS i
        ON g.artcode = i.ItemCode 
            AND g.reknr = i.GLAccountDistribution 
            AND ( g.transtype = 'N' 
                    OR ( g.transtype = 'B' 
                          AND g.transsubtype = 'B' 
                          AND g.freefield1 NOT IN ( 'B', 'Q', 'W', 'K' ) 
                          AND g.blockitem = '0' 
                          AND g.allocationtype = 'F' ) 
                     OR ( g.transtype = 'B' 
                          AND g.transsubtype = 'B' 
                          AND g.freefield1 = 'V' 
                          AND g.allocationtype = 'B' ) ) 
WHERE  g.transtype = 'N' 
       AND ( i.itemcode = 'TESTARTIKEL' 
              OR i.itemcode = 'IQ7-60-2-INT' ) 
GROUP  BY i.itemcode, 
          g.warehouse, 
          g.linkedline
) x where rowno=1 ;    
0 голосов
/ 09 мая 2019
SELECT i.ItemCode, g.warehouse, SUM(g.aantal) AS Voorraad, 
MAX(CASE WHEN g.transtype = 'N' THEN g.sysmodified ELSE NULL END) AS LastDate
FROM    dbo.gbkmut AS g INNER JOIN  dbo.Items AS i
    ON g.artcode = i.ItemCode AND g.reknr = i.GLAccountDistribution AND (
                                            g.transtype = 'N' OR
                                            (g.transtype = 'B' AND 
                                            g.transsubtype = 'B' AND 
                                            g.freefield1 NOT IN ('B', 'Q', 'W', 'K') AND 
                                            g.BlockItem = '0' AND 
                                            g.AllocationType = 'F') OR ( g.transtype = 'B' AND g.transsubtype = 'B' AND g.freefield1 = 'V' AND g.AllocationType = 'B'))
WHERE g.transtype = 'N' AND i.ItemCode = 'IQ7-60-2-INT' GROUP BY i.ItemCode, g.warehouse, g.LinkedLine

Это возвращает результаты сначала Voorraad 0 и со сценарием DwightReynoldson возвращает 1080

0 голосов
/ 09 мая 2019

Вы можете использовать:

select *****Here the columns that you want to use****** from (****Your query****) anyName

В вашем случае:

select *****Here the columns that you want to use****** from (
SELECT i.ItemCode, g.warehouse, SUM(g.aantal) AS Voorraad, MAX(CASE WHEN g.transtype = 'N' THEN g.sysmodified ELSE NULL END) AS LastDate
FROM    dbo.gbkmut AS g INNER JOIN  dbo.Items AS i
        ON g.artcode = i.ItemCode AND g.reknr = i.GLAccountDistribution AND (
                                                g.transtype = 'N' OR
                                                (g.transtype = 'B' AND 
                                                g.transsubtype = 'B' AND 
                                                g.freefield1 NOT IN ('B', 'Q', 'W', 'K') AND 
                                                g.BlockItem = '0' AND 
                                                g.AllocationType = 'F') OR ( g.transtype = 'B' AND g.transsubtype = 'B' AND g.freefield1 = 'V' AND g.AllocationType = 'B'))
WHERE g.transtype = 'N' AND (i.ItemCode = 'TESTARTIKEL' OR i.ItemCode = 'IQ7-60-2-INT') GROUP BY i.ItemCode, g.warehouse, g.LinkedLine 

) Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...