2016-08-02 89 views
1

我試圖獲取不同表中每一行的循環結果。我需要知道哪個產品線,每個銷售代理,在一個月內出售。爲另一個表的每一行循環相同的查詢

我已經向我展示瞭如何知道產品線總數的查詢。我只需要在它內部插入,在where條件中的「CODAGENT」,循環通過代理表中的每個代理。因此,不要使用sql語言來創建示例。

-----THIS IS NOT A USEFUL CODE, IT'S ONLY FOR UNDERSTANDING---- 
For Each Row in Agents TAble Do 
Set #CODAGENT = Row 1,2,3,.... 
Select 
-routine for selecting what i need with inside WHERE CODAGENT = #CODAGENT 
Next Row 
-----THIS IS NOT A USEFUL CODE, IT'S ONLY FOR UNDERSTANDING---- 

我需要獲得這樣的結果,但在每個代理單獨的表

SELECT     
          TABCATEGORIE.DESCRIZIONE, 
          TABCATEGORIESTAT.DESCRIZIONE, 
          LEFT(SUM(TOTNETTORIGA),LEN(SUM(TOTNETTORIGA))-2), 
          TABGRUPPI.DESCRIZIONE, 
          ANAGRAFICAAGENTI.CODAGENTE, 
          ANAGRAFICAAGENTI.DSCAGENTE 
FROM dbo.TESTEDOCUMENTI 
INNER JOIN dbo.RIGHEDOCUMENTI ON PROGRESSIVO=IDTESTA 
INNER JOIN dbo.ANAGRAFICAARTICOLI 
ON CODART=ANAGRAFICAARTICOLI.CODICE 
INNER JOIN dbo.TABCATEGORIE ON CATEGORIA=TABCATEGORIE.CODICE 
INNER JOIN dbo.TABCATEGORIESTAT ON CODCATEGORIASTAT=TABCATEGORIESTAT.CODICE 
INNER JOIN dbo.TABGRUPPI ON GRUPPO=TABGRUPPI.CODICE 
INNER JOIN dbo.ANAGRAFICAAGENTI ON ANAGRAFICAAGENTI.CODAGENTE=CODAGENTE1 
WHERE dbo.TESTEDOCUMENTI.DOCCHIUSO = '0' AND dbo.TESTEDOCUMENTI.TIPODOC = 'FVC' AND dbo.TESTEDOCUMENTI.DATADOC BETWEEN DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-2, 0) AND DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-2, -1) 
GROUP BY GRUPPO,CATEGORIA,CODCATEGORIASTAT,TABCATEGORIE.DESCRIZIONE,TABCATEGORIESTAT.DESCRIZIONE,TABGRUPPI.DESCRIZIONE,ANAGRAFICAAGENTI.CODAGENTE,ANAGRAFICAAGENTI.DSCAGENTE 
ORDER BY CODAGENTE DESC 

它是意大利人,我不知道你是否瞭解

Sample Data 

ANAGRAFICAAGENTI 
CODAGENTE | DSCAGENTE 
A1  | Agent Name 

then there is the result of the query. So The result is 

CATEGORY | CATEGORY2  |TOTNETTORIGA| GRUPPI   | CODAGENTE | DSCAGENTE 
------------+---------------+------------+------------------+-----------+---------- 
TAVOLI  | TAVOLI  | 22571.36 | PRODOTTO FINITO | A 77 | name 
PENSILI  | PENSILI  | 1319.12 | PRODOTTO FINITO | A 77 | name 
LAVATOIO | LAVATOIO  | 7411.08 | PRODOTTO FINITO | A 77 | name 
LAVATOIO | MACELLERIA | 505.00  | PRODOTTO FINITO | A 77 | name 
MACELLERIA | MACELLERIA | 3762.00 | PRODOTTO FINITO | A 77 | name 
LINEA PESCE | LINEA PESCE | 3824.00 | PRODOTTO FINITO | A 77 | name 
TAVOLI  | TAVOLI  | 1073.60 | PRODOTTO FINITO | A 76 | name1 
PENSILI  | PENSILI  | 262.80  | PRODOTTO FINITO | A 76 | name1 

達到了這個新的一步實現我的目標但仍然行不通。這是我的查詢:

---CREO IL CURSORE C PER CALCOLARE GLI AGENTI--- 
DECLARE c CURSOR FOR 
SELECT DISTINCT 
    ANAGRAFICAAGENTI.CODAGENTE 
FROM dbo.ANAGRAFICAAGENTI 
----DICHIARO LA VARIABILE PER AGENTE 
DECLARE @AgentID VARCHAR(4) 
----PRENDI IL PRIMO AGENTE E METTILO NELLA VARIABILE---- 
OPEN c 
FETCH NEXT FROM c INTO @AgentID 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SELECT 

          ANAGRAFICAAGENTI.DSCAGENTE, 
          ANAGRAFICAAGENTI.CODAGENTE, 
           TABCATEGORIE.DESCRIZIONE, 
          TABCATEGORIESTAT.DESCRIZIONE, 
          LEFT(SUM(TOTNETTORIGA),LEN(SUM(TOTNETTORIGA))-2), 
          TABGRUPPI.DESCRIZIONE 

FROM dbo.TESTEDOCUMENTI 
INNER JOIN dbo.RIGHEDOCUMENTI ON PROGRESSIVO=IDTESTA 
INNER JOIN dbo.ANAGRAFICAARTICOLI 
ON CODART=ANAGRAFICAARTICOLI.CODICE 
INNER JOIN dbo.TABCATEGORIE ON CATEGORIA=TABCATEGORIE.CODICE 
INNER JOIN dbo.TABCATEGORIESTAT ON CODCATEGORIASTAT=TABCATEGORIESTAT.CODICE 
INNER JOIN dbo.TABGRUPPI ON GRUPPO=TABGRUPPI.CODICE 
LEFT JOIN dbo.ANAGRAFICAAGENTI ON ANAGRAFICAAGENTI.CODAGENTE=CODAGENTE1 
WHERE ANAGRAFICAAGENTI.CODAGENTE = @AgentID AND dbo.TESTEDOCUMENTI.DOCCHIUSO = '0' AND dbo.TESTEDOCUMENTI.TIPODOC = 'FVC' AND dbo.TESTEDOCUMENTI.DATADOC BETWEEN DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-2, 0) AND DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-2, -1) 
GROUP BY GRUPPO,CATEGORIA,CODCATEGORIASTAT,TABCATEGORIE.DESCRIZIONE,TABCATEGORIESTAT.DESCRIZIONE,TABGRUPPI.DESCRIZIONE,ANAGRAFICAAGENTI.CODAGENTE,ANAGRAFICAAGENTI.DSCAGENTE 
ORDER BY CODAGENTE DESC,SUM(TOTNETTORIGA) desc 
--PRENDI IL PROSSIMO AGENTE--- 
FETCH NEXT FROM c INTO @AgentID 
END 
--PULISCI--- 
CLOSE c 
DEALLOCATE c 

這使我有不同的表,我認爲,每個代理在表中。但他們都是空的。如果我在WHERE條件中刪除ANAGRAFICAAGENTI.CODAGENTE = @AgentID,我會獲得同樣的表格,但每個表格的結果相同。他們都是平等的。

+0

這是什麼意思..Set #CODAGENT =行1,2,3,.... – TheGameiswar

+0

使用表格解釋你正在嘗試做什麼,可能會出現循環方式 – TheGameiswar

+0

可以使用SQL遊標作爲在教程http://www.kodyaz.com/articles/cursor.aspx中顯示。但要注意,遊標是解決SQL Server上的問題,出於性能考慮,最後的辦法 – Eralper

回答

1

SQL最適合於基於集合的操作,但使用循環的一種方法是使用CURSORFETCH。您需要對這些數據進行研究並將其正確應用於您的數據,特別是因爲您說「獲得此結果但在單獨的表格中」。我不知道你是想插入一個新的表格還是隻在單獨的窗口窗格中返回結果。這會讓你開始

--declare a cursor which will be the ID's of your agents. You can use what ever you want to limit your data off of 
DECLARE c CURSOR FOR 
SELECT DISTINCT 
    CODAGENTE 
FROM ANAGRAFICAAGENTI 

DECLARE @AgentID VARCHAR(4) 

--get the first agent id and place it into a variable 
OPEN c 
FETCH NEXT FROM c INTO @AgentID 


--for each agent id, select some data where the agent id equals the current agent id in the cursor 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SELECT 
      --put your code here for selecting, inserting into a table, etc 
     WHERE ANAGRAFICAAGENTI.CODAGENTE = @AgentID --or what ever is appropiate 

     --get the next agent 
     FETCH NEXT FROM c INTO @AgentID 
    END 
--clean up 
CLOSE c 
DEALLOCATE c 

而對於獎勵積分,我建議你開始在你的代碼中使用表別名。這會使你和未來的其他人更清晰。

https://technet.microsoft.com/en-us/library/ms187455(v=sql.105).aspx

SQL Table Aliases - Good or Bad?

樣本集

點擊HERE運行下面的代碼...

IF OBJECT_ID('tempdb..#agents') IS NOT NULL DROP TABLE #agents 
IF OBJECT_ID('tempdb..#items') IS NOT NULL DROP TABLE #items 

create table #agents (AgentID varchar(2), name varchar(50)) 
insert into #agents values 
('A1','Julius Cesar'), 
('B2','Albert Einstien') 


create table #items (AgentID varchar(2), ItemID int, ItemName varchar(50)) 
insert into #items (AgentID, ItemID, ItemName) values 
('A1',1,'Apple'), 
('A1',2,'Pear'), 
('A1',3,'Watermelon'), 
('A1',4,'Grape'), 
('B2',5,'Car'), 
('B2',6,'Truck'), 
('B2',7,'Van') 

DECLARE c CURSOR FOR 
SELECT DISTINCT 
    AgentID 
FROM #agents 

DECLARE @AgentID VARCHAR(4) 

--get the first agent id and place it into a variable 
OPEN c 
FETCH NEXT FROM c INTO @AgentID 

--for each agent id, select some data where the agent id equals the current agent id in the cursor 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SELECT 
      AgentID, ItemID, ItemName 
     FROM #items 
     WHERE AgentID = @AgentID --or what ever is appropiate 

     --get the next agent 
     FETCH NEXT FROM c INTO @AgentID 
    END 

--clean up 
CLOSE c 
DEALLOCATE c 
+0

最初它不起作用。然後我刪除在哪裏結束,並且它爲每個代理創建一張表,我認爲,但表都是空的。如果我刪除WHERE ANAGRAFICAAGENTI.CODAGENTE = @AgentID條件和全部離開其他的,我一直都表平等的結果---如果我把所有喜歡你的我有此錯誤消息156,級別15,狀態1,行39 關鍵字'CLOSE'附近的語法不正確。 – BigBlack

+0

Tryed還與腳本的示例版本僅'SELECT codagente1, datadoc,tipodoc,codclifor FROM INOXDGI.dbo.TESTEDOCUMENTI LEFT JOIN dbo.ANAGRAFICAAGENTI ON CODAGENTE = CODAGENTE1 WHERE TESTEDOCUMENTI.CODAGENTE1 = @ AgentID' – BigBlack

+0

@BigBlack我不小心在那裏留下了額外的'END'。我修好了它。它會運行,我提供了一個樣本。 – scsimon

0

如果我unserstand您的問題正確,則我認爲你可以使用一個cross apply運算符。

爲了顯示我的意思讓我們查找一些示例數據。在開始時我宣佈這樣

declare @Agents table (AgentId int, AgentName nvarchar(max)); 
declare @Products table (ProductId int, ProductName nvarchar(max), Price money); 
declare @Transactions table (TransactionId int, TransactionDate date, AgentId int, ProductId int, Quantity int); 

代理商,產品實行臨時表和交易然後我填補像這樣

insert into @Agents 
values (1, N'Agnet1'), (2, N'Agent2'), (3, N'Agent3'), (4, N'Agent4'); 

insert into @Products 
values (1, N'Product1', 100), (2, N'Product2', 150.50), (3, N'Product3', 200), (4, N'Product4', 50.23); 

insert into @Transactions 
values (1, '20160604', 1, 1, 5), (2, '20160704', 2, 1, 10), (3,'20160612', 2, 1, 15), (4, '20160604', 1, 2, 7), 
     (5, '20160720', 3, 4, 1), (6, '20160604', 2, 4, 3), (7, '20160730', 4, 3, 8), (8, '20160612', 2, 3, 13), 
     (9, '20160708', 4, 2, 6), (10, '20160705', 1, 3, 1), (11, '20160616', 4, 2, 17), (12, '20160709', 2, 3, 13); 

一些樣本數據和樣本數據表我已經準備此查詢來獲取每個代理

declare @year int; 
declare @month int; 

select a.AgentName, 
trans.ProductName, 
trans.Amount 
from @Agents as a 
cross apply 
( select t.ProductId, 
    max(p.ProductName) as ProductName, 
    sum(t.Quantity * p.Price) as Amount 
    from @Transactions as t 
    inner join @Products as p on p.ProductId = t.ProductId 
    where t.AgentId = a.AgentId 
    and year(t.TransactionDate) = @year 
    and month(t.TransactionDate) = @month 
    group by t.ProductId) as trans 

統計有關的輸出@year = 2016@month = 6你可以看到這個

AgentName ProductName  Amount 
Agnet1  Product1  500,00 
Agnet1  Product2  1053,50 
Agent2  Product1  1500,00 
Agent2  Product3  2600,00 
Agent2  Product4  150,69 
Agent4  Product2  2558,50 

而對於@year = 2016@month = 7你會SE這是retrive的

AgentName ProductName  Amount 
Agnet1  Product3  200,00 
Agent2  Product1  1000,00 
Agent2  Product3  2600,00 
Agent3  Product4  50,23 
Agent4  Product2  903,00 
Agent4  Product3  1600,00 

正如你可以看到我要求每個代理形式@Agents表,併爲他們每個人我執行額外的查詢關於產品和總金額的數據來自@Transactions表。

+0

謝謝zajonc,但是這是最具代理月份,我喜歡,但我現在需要的是scsimon的下面的解決方案。隨時隨地感謝您! – BigBlack

相關問題