2015-08-20 3 views
0

Это примерный вывод таблицы D009022.Группа SQL Server По разделу

LBrCode PrdAcctId 
1  20060000000001420000000100000000 
1  20060003002891900000000100000000 
1  20060004001110490000000100000000 

Я использую этот запрос для расчета общего количества продукта.

SELECT 
    A.LBrCode AS BranchCode, 
    (SELECT B.Name FROM D001003 B WHERE A.LBrCode = B.PBrCode) AS BranchName, 
    substring(A.PrdAcctId,1,8) AS ProductCode, 
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060000' 
      THEN count(substring(A.PrdAcctId,1,8)) 
    END) AS Miulasi, 
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060001' 
      THEN count(substring(A.PrdAcctId,1,8)) 
    END) AS Piripun, 
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060002' 
      THEN count(substring(A.PrdAcctId,1,8)) 
    END) AS Prime, 
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060003' 
      THEN count(substring(A.PrdAcctId,1,8)) 
    END) AS Sipsaviya, 
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060004' 
      THEN count(substring(A.PrdAcctId,1,8)) 
    END) AS Yalu, 
    (CASE WHEN substring(A.PrdAcctId,1,8)='20060007' 
      THEN count(substring(A.PrdAcctId,1,8)) 
    END) AS Company, 
    SUM(substring(A.PrdAcctId,1,8)) AS AccTotal 
FROM 
    D009022 A 
WHERE 
    A.AcctStat<>3 AND 
    substring(A.PrdAcctId, 1, 8)='20060000' 
    OR substring(A.PrdAcctId, 1, 8)='20060001' 
    OR substring(A.PrdAcctId, 1, 8)='20060002' 
    OR substring(A.PrdAcctId, 1, 8)='20060003' 
    OR substring(A.PrdAcctId, 1, 8)='20060004' 
    OR substring(A.PrdAcctId, 1, 8)='20060007' 
GROUP BY 
    A.LBrCode, substring(A.PrdAcctId, 1, 8) 
ORDER BY 
    A.LBrCode, substring(A.PrdAcctId, 1, 8) 

Но это так выглядит.

BranchCode BranchName ProductCode Miulasi Piri Prime Sipsaviya Yalu Company Acc 
    1  City  20060000 5298          5298 
    1  City  20060001   20        20 
    1  City  20060002     477       477 

Как можно показать результаты за BranchCode? Как и для каждой ветви только одна строка.

+0

Как насчет использования 'GROUP BY A.LBrCode'? –

+0

Он говорит, что PrdAcctId 'недопустим в списке выбора, потому что он не содержится ни в агрегатной функции –

+0

Это невозможно, если вы также хотите выбрать столбцы без учета. Представьте, что вы получили бы только одну запись за LBrCode, если бы вы сгруппировали именно это. Как получить имя филиала и идентификатор продукта. Существует ли однозначное сопоставление между BrnachCode, BranchName и ProductCode? Если да, то зачем беспокоиться о группировке только LbrCode !? – niksofteng

ответ

2

Это будет работать. Вы можете написать Substring (A.PrdAcctId, 1, 8) в функции MAX(), поскольку она уникальна для каждого кода. Поскольку MAX (10) = 10, поэтому он не меняет выход.

SELECT A.LBrCode       AS BranchCode, 
    (SELECT B.Name 
    FROM D001003 B 
    WHERE A.LBrCode = B.PBrCode 
    ) AS BranchName, 
    MAX(Substring(A.PrdAcctId, 1, 8))  AS ProductCode, 
    Count(CASE 
      WHEN Substring(A.PrdAcctId, 1, 8) = '20060000' THEN Substring(A.PrdAcctId, 1, 8) 
     END)      AS Miulasi, 
    Count(CASE 
      WHEN Substring(A.PrdAcctId, 1, 8) = '20060001' THEN Substring(A.PrdAcctId, 1, 8) 
     END)      AS Piripun, 
    Count(CASE 
      WHEN Substring(A.PrdAcctId, 1, 8) = '20060002' THEN Substring(A.PrdAcctId, 1, 8) 
     END)      AS Prime, 
    Count(CASE 
      WHEN Substring(A.PrdAcctId, 1, 8) = '20060003' THEN Substring(A.PrdAcctId, 1, 8) 
     END)      AS Sipsaviya, 
    Count(CASE 
      WHEN Substring(A.PrdAcctId, 1, 8) = '20060004' THEN Substring(A.PrdAcctId, 1, 8) 
     END)      AS Yalu, 
    Count(CASE 
      WHEN Substring(A.PrdAcctId, 1, 8) = '20060007' THEN Substring(A.PrdAcctId, 1, 8) 
     END)      AS Company, 
    Sum(Substring(A.PrdAcctId, 1, 8)) AS AccTotal 
FROM D009022 A 
WHERE A.AcctStat <> 3 
    AND Substring(A.PrdAcctId, 1, 8) IN ('20060000', '20060001', '20060002','20060003','20060004', '20060007') 
GROUP BY A.LBrCode 
ORDER BY A.LBrCode 
+0

Thanx man ... это сработало –

+0

Мое удовольствие. @DeEDEe –

0

Count должен прийти на вершине case заявления

SELECT A.LBrCode       AS BranchCode, 
     (SELECT B.Name 
     FROM D001003 B 
     WHERE A.LBrCode = B.PBrCode) AS BranchName, 
     Substring(A.PrdAcctId, 1, 8)  AS ProductCode, 
     Count(CASE 
       WHEN Substring(A.PrdAcctId, 1, 8) = '20060000' THEN Substring(A.PrdAcctId, 1, 8) 
      END)      AS Miulasi, 
     Count(CASE 
       WHEN Substring(A.PrdAcctId, 1, 8) = '20060001' THEN Substring(A.PrdAcctId, 1, 8) 
      END)      AS Piripun, 
     Count(CASE 
       WHEN Substring(A.PrdAcctId, 1, 8) = '20060002' THEN Substring(A.PrdAcctId, 1, 8) 
      END)      AS Prime, 
     Count(CASE 
       WHEN Substring(A.PrdAcctId, 1, 8) = '20060003' THEN Substring(A.PrdAcctId, 1, 8) 
      END)      AS Sipsaviya, 
     Count(CASE 
       WHEN Substring(A.PrdAcctId, 1, 8) = '20060004' THEN Substring(A.PrdAcctId, 1, 8) 
      END)      AS Yalu, 
     Count(CASE 
       WHEN Substring(A.PrdAcctId, 1, 8) = '20060007' THEN Substring(A.PrdAcctId, 1, 8) 
      END)      AS Company, 
     Sum(Substring(A.PrdAcctId, 1, 8)) AS AccTotal 
FROM D009022 A 
WHERE A.AcctStat <> 3 
     AND Substring(A.PrdAcctId, 1, 8) IN ('20060000', '20060001', '20060002', '20060003', 
              '20060004', '20060007') 
GROUP BY A.LBrCode, 
      Substring(A.PrdAcctId, 1, 8) 
ORDER BY A.LBrCode, 
      Substring(A.PrdAcctId, 1, 8) 

Это один более читаемым

WITH cte 
    AS (SELECT A.LBrCode      AS BranchCode, 
       (SELECT B.Name 
       FROM D001003 B 
       WHERE A.LBrCode = B.PBrCode) AS BranchName, 
       Substring(A.PrdAcctId, 1, 8) AS ProductCode, 
       A.PrdAcctId 
     FROM D009022 A 
     WHERE A.AcctStat <> 3 
       AND Substring(A.PrdAcctId, 1, 8) IN ('20060000', '20060001', '20060002', '20060003', 
                 '20060004', '20060007')) 
SELECT BranchCode, 
     BranchName, 
     ProductCode, 
     Count(CASE 
       WHEN ProductCode = '20060000' THEN ProductCode 
      END)  AS Miulasi, 
     Count(CASE 
       WHEN ProductCode = '20060001' THEN ProductCode 
      END)  AS Piripun, 
     Count(CASE 
       WHEN ProductCode = '20060002' THEN ProductCode 
      END)  AS Prime, 
     Count(CASE 
       WHEN ProductCode = '20060003' THEN ProductCode 
      END)  AS Sipsaviya, 
     Count(CASE 
       WHEN ProductCode = '20060004' THEN ProductCode 
      END)  AS Yalu, 
     Count(CASE 
       WHEN ProductCode = '20060007' THEN ProductCode 
      END)  AS Company, 
     Sum(ProductCode) AS AccTotal 
FROM cte 
GROUP BY LBrCode, 
      BranchName, 
      ProductCode 
ORDER BY LBrCode, 
      ProductCode 
+0

есть все равно, где я могу группировать только LBrCode? –

+0

@DeEDEe - Тогда вам нужно удалить 'ProductCode' из' select' –

Смежные вопросы