2016-05-18 5 views
-2

У меня есть две таблицы, которые я связываю с INNER JOIN. Это таблица заголовков счетов-фактур и таблица счетов-фактур.Столбец счетчика в запросе SQL

Что бы я хотел добавить, это какой-то столбец счетчика, который дал бы мне 1 для каждого уникального номера счета, а 0 для любого дублированного номера счета-фактуры, если счет-фактура имеет более одной позиции. Тогда я позволю мне запустить подсчет по различным столбцам в Excel, когда я проанализирую свои данные позже. В принципе, это счет, но только по записям левой таблицы, игнорируя правую таблицу.

Я просто не могу понять, как использовать COUNT() или CASE, чтобы заставить это работать. Это вообще возможно?

Это мой запрос:

SELECT P.DocNum 
    , L.LineNum 
    , P.DocCur 
    , P.DocTotalFC 
    , P.DocTotal 
    , CASE 
     WHEN LEFT(L.AcctCode, 1) = '7' THEN 'Admin' 
     WHEN LEFT(L.AcctCode, 2) = '15' THEN 'Admin' 
     WHEN L.AcctCode = '11501'  THEN 'MX' 
     WHEN LEFT(L.Project, 1) = 'W' THEN 'MX' 
     WHEN L.OcrCode2 = '570'   THEN 'MEC' 
     WHEN L.OcrCode2 = '590'   THEN 'ZHU' 
     ELSE 'Flight Ops' 
     END AS 'Type' 
    , L.AcctCode AS 'Account' 
    , L.OcrCode AS 'Aircraft' 
    , L.OcrCode2 AS 'Department' 
    , L.OcrCode3 AS 'Business Unit' 
    , L.Project AS 'Project'    
    , L.LineTotal 
FROM OPCH P 
    INNER JOIN PCH1 L ON P.DocEntry = L.DocEntry 
WHERE P.DocDate BETWEEN '2016-01-01' AND '2016-03-31' 
ORDER BY P.DocNum, L.LineNum 

Любые намеки высоко оценены.

Заранее спасибо.

+0

Какой из номер счета? Какая версия 'SQL Server'? –

+0

Номер счета-фактуры - поле DocNum. Сервер SQL Server 2008. Строка_раздела над разделом от Sagi делает трюк :) – Matth

ответ

2

Я думаю, что вам нужно ROW_NUMBER() и не COUNT():

SELECT P.DocNum 
    , L.LineNum 
    , P.DocCur 
    , P.DocTotalFC 
    , P.DocTotal 
    , CASE 
     WHEN LEFT(L.AcctCode, 1) = '7' THEN 'Admin' 
     WHEN LEFT(L.AcctCode, 2) = '15' THEN 'Admin' 
     WHEN L.AcctCode = '11501'  THEN 'MX' 
     WHEN LEFT(L.Project, 1) = 'W' THEN 'MX' 
     WHEN L.OcrCode2 = '570'   THEN 'MEC' 
     WHEN L.OcrCode2 = '590'   THEN 'ZHU' 
     ELSE 'Flight Ops' 
     END AS 'Type' 
    , L.AcctCode AS 'Account' 
    , L.OcrCode AS 'Aircraft' 
    , L.OcrCode2 AS 'Department' 
    , L.OcrCode3 AS 'Business Unit' 
    , L.Project AS 'Project'    
    , L.LineTotal 
    , CASE WHEN ROW_NUMBER() OVER(PARTITION BY p.docnum ORDER BY p.docDate) > 1 
      then 0 
      else 1 
     end as rnk 
FROM OPCH P 
    INNER JOIN PCH1 L ON P.DocEntry = L.DocEntry 
WHERE P.DocDate BETWEEN '2016-01-01' AND '2016-03-31' 
ORDER BY P.DocNum, L.LineNum 

Вы не предоставили достаточно деталей, чтобы понять, какой столбец является уникальным номером счета-фактуры, а какой столбец вы dicide, который является первым (получает значение 1) и дублирует (получает значение 0). Я использовал docnum в качестве номера счета-фактуры и docdate в качестве столбца для определения дубликатов, при необходимости отрегулируйте его.

Если заказ не имеет значения - его полный дубликат и не имеет значения, какая запись является дубликатом, то порядок по частям не имеет значения.

+0

DocNum - номер счета, как вы правильно предполагали. спасибо. Я знал функцию row_number(), но не знал трюк «partition by». Удивительно, спасибо. – Matth

1

Как я не знаю точные данные, основанные на предположении, я использовал row_number и Case состояние мы можем получить 1 для нормальных значений и 0 для повторяющихся значений

SELECT P.DocNum 
    , L.LineNum 
    , P.DocCur 
    , P.DocTotalFC 
    , P.DocTotal 
    , CASE 
     WHEN LEFT(L.AcctCode, 1) = '7' THEN 'Admin' 
     WHEN LEFT(L.AcctCode, 2) = '15' THEN 'Admin' 
     WHEN L.AcctCode = '11501'  THEN 'MX' 
     WHEN LEFT(L.Project, 1) = 'W' THEN 'MX' 
     WHEN L.OcrCode2 = '570'   THEN 'MEC' 
     WHEN L.OcrCode2 = '590'   THEN 'ZHU' 
     ELSE 'Flight Ops' 
     END AS 'Type' 
    , L.AcctCode AS 'Account' 
    , L.OcrCode AS 'Aircraft' 
    , L.OcrCode2 AS 'Department' 
    , L.OcrCode3 AS 'Business Unit' 
    , L.Project AS 'Project'    
    , L.LineTotal 
    , CASE WHEN ROW_NUMBER()OVER(PARTITION BY P.DocNum,L.LineNum ORDER BY (SELECT NULL)) = 1 THEN 1 ELSE 0 END SummaryValues 
FROM OPCH P 
    INNER JOIN PCH1 L ON P.DocEntry = L.DocEntry 
WHERE P.DocDate BETWEEN '2016-01-01' AND '2016-03-31' 
ORDER BY P.DocNum, L.LineNum 
0
;with cte as (
    SELECT 
     a.DocEntry, joincounter = count(b.DocEntry) 
    FROM 
     OPCH P AS a 
     INNER JOIN PCH1 AS b ON a.DocEntry = b.DocEntry 
    group by a.DocEntry 
) 
SELECT 
    case 
     when cte.joincounter > 1 then 0 
     else cte.joincounter 
    end as joincounter 

    ,P.DocNum 
    , L.LineNum 
    , P.DocCur 
    , P.DocTotalFC 
    , P.DocTotal 
    , CASE 
     WHEN LEFT(L.AcctCode, 1) = '7' THEN 'Admin' 
     WHEN LEFT(L.AcctCode, 2) = '15' THEN 'Admin' 
     WHEN L.AcctCode = '11501'  THEN 'MX' 
     WHEN LEFT(L.Project, 1) = 'W' THEN 'MX' 
     WHEN L.OcrCode2 = '570'   THEN 'MEC' 
     WHEN L.OcrCode2 = '590'   THEN 'ZHU' 
     ELSE 'Flight Ops' 
    END AS 'Type' 
    , L.AcctCode AS 'Account' 
    , L.OcrCode AS 'Aircraft' 
    , L.OcrCode2 AS 'Department' 
    , L.OcrCode3 AS 'Business Unit' 
    , L.Project AS 'Project'    
    , L.LineTotal 
FROM 
    OPCH P 
    INNER JOIN PCH1 L ON P.DocEntry = L.DocEntry 
    inner join cte on cte.DocEntry = P.DocEntry 
WHERE 
    P.DocDate >= '2016-01-01' 
    AND P.DocDate < '2016-03-31' 
ORDER BY 
    P.DocNum, L.LineNum 
Смежные вопросы