2016-08-02 39 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

相关问题