Sql server 你想要什么样的发货日期?这是一个很好的起点。看起来你想要一个动态轴心。。。三次。。。这是不可能的sense@SeanLange我的坏毛病是我修好的。感谢您的奇怪输出,但您可以通过动态交叉表轻松解决此问题。由于您试图将[ship date]和[custome
Sql server 你想要什么样的发货日期?这是一个很好的起点。看起来你想要一个动态轴心。。。三次。。。这是不可能的sense@SeanLange我的坏毛病是我修好的。感谢您的奇怪输出,但您可以通过动态交叉表轻松解决此问题。由于您试图将[ship date]和[custome,sql-server,tsql,Sql Server,Tsql,你想要什么样的发货日期?这是一个很好的起点。看起来你想要一个动态轴心。。。三次。。。这是不可能的sense@SeanLange我的坏毛病是我修好的。感谢您的奇怪输出,但您可以通过动态交叉表轻松解决此问题。由于您试图将[ship date]和[customer]保留为一列,因此我认为如果没有某种循环(光标、while等),您无法实现这一点,或者是否仍可以包括[customer1][customer2]和[ship date1][ship date2],然后使用view或cte过滤掉它们?非常感谢C
你想要什么样的发货日期?这是一个很好的起点。看起来你想要一个动态轴心。。。三次。。。这是不可能的sense@SeanLange我的坏毛病是我修好的。感谢您的奇怪输出,但您可以通过动态交叉表轻松解决此问题。由于您试图将[ship date]和[customer]保留为一列,因此我认为如果没有某种循环(光标、while等),您无法实现这一点,或者是否仍可以包括[customer1][customer2]和[ship date1][ship date2],然后使用view或cte过滤掉它们?非常感谢Chris!!如何将该值插入另一个表记录在##Results_2017_06_28表中。您可以使用“insert into”,但由于我们不知道执行时的列是什么,因此必须使用“*”。我试图找出一种方法,至少能让它们按正确的顺序排列,但现在证明这是不可能的。这会被应用程序使用吗?谢谢Chris,工作很好。当
ship date
=getdate()时,我可以在此基础上创建触发器吗?`为什么要创建触发器?我是DBA新手,但有一件事我听说过,也看到过,触发器可能非常糟糕(隐藏复杂性,因为它会造成复杂性),而且在大多数情况下,创建更好的解决方案可以轻松避免。每天或每小时触发插入
PO CUSTOMER CUST PN PN DESC QTY SHIP DATE
001 xxx 111 100200 description1 24 2017-06-27
002 xxx 112 100201 description2 25 2017-06-27
PO1 PO2 CUSTOMER CUST PN1 CUST PN2 PN1 PN2 DESC 1 DESC 2 QTY1 QTY2 SHIP DATE
001 002 xxx 111 112 100200 100201 description1 description2 24 25 2017-06-27
SELECT
[PO #], [CUSTOMER], [CUST PN], [PN], [DESC], [QTY], [SHIP DATE]
FROM
(SELECT
[PO #], [CUSTOMER], [CUST PN], [PN], [DESC], [QTY], [SHIP DATE]
FROM
WORKORDERS S
WHERE
[SHIP BY] = DATEADD(day, -1, CONVERT(VARCHAR(11), GETDATE(), 106))) AS s
DECLARE @workorders AS TABLE
(
[PO #] NVARCHAR(10),
[CUSTOMER] NVARCHAR(200),
[CUST PN] INT,
[PN] INT,
[DESC] NVARCHAR(500),
[QTY] INT,
[SHIP DATE] DATE
);
--DECLARE @workorders_W_GroupingID AS TABLE
--(
-- groupingID INT,
-- [PO #] NVARCHAR(10),
-- [CUSTOMER] NVARCHAR(200),
-- [CUST PN] INT,
-- [PN] INT,
-- [DESC] NVARCHAR(500),
-- [QTY] INT,
-- [SHIP DATE] DATE
--);
INSERT @workorders
(
[PO #],
CUSTOMER,
[CUST PN],
PN,
[DESC],
QTY,
[SHIP DATE]
)
VALUES
('001', N'xxx', 111, 100200, N'description1', 24, '2017-06-27'),
('002', N'xxx', 112, 100200, N'description2', 24, '2017-06-27'),
('003', N'xxx', 113, 100200, N'description3', 24, '2017-06-28'),
('004', N'xxx', 114, 100200, N'description4', 24, '2017-06-25'),
('005', N'aaa', 115, 100200, N'description5', 24, '2017-06-27'),
('006', N'aaa', 116, 100200, N'description6', 24, '2017-06-28'),
('007', N'aaa', 117, 100200, N'description7', 24, '2017-06-28'),
('008', N'ccc', 118, 100200, N'description8', 24, '2017-06-27'),
('009', N'xxx', 119, 100200, N'description9', 24, '2017-06-27');
--INSERT INTO @workorders_W_GroupingID
SELECT ROW_NUMBER() OVER (PARTITION BY S.CUSTOMER, S.[SHIP DATE] ORDER BY S.[PO #]) AS groupingID,
S.*
INTO #workorders_W_GroupingID
FROM @workorders S;
SELECT * FROM #workorders_W_GroupingID;--DISPLAY
--COUNTER
DECLARE @CUNTER INT;
DECLARE @MAX_CUNTER INT;
SET @MAX_CUNTER =
(
SELECT MAX(groupingID) FROM #workorders_W_GroupingID
);
DECLARE @query_Select NVARCHAR(MAX),
@query_From NVARCHAR(MAX),
@query_Into NVARCHAR(MAX),
@query_OrderBy NVARCHAR(MAX),
@query NVARCHAR(MAX);
SET @query_Select = N'SELECT ';
----PO----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT PO FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'PO' + CONVERT(NVARCHAR(100), @CUNTER) + ',');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----CUSTOMER----
SET @query_Select = @query_Select + (' CASE WHEN temp.groupingID = 1 THEN temp.CUSTOMER END AS' + N' customer, ');
----CUST PN----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT [CUST PN] FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'[CUST PN' + CONVERT(NVARCHAR(100), @CUNTER) + '],');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----PN----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT PN FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'PN' + CONVERT(NVARCHAR(100), @CUNTER) + ',');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----DESC----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT [DESC] FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'DESC' + CONVERT(NVARCHAR(100), @CUNTER) + ',');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----QTY----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT QTY FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'QTY' + CONVERT(NVARCHAR(100), @CUNTER) + ',');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----SHIP DATE----
SET @query_Select = @query_Select + (' CASE WHEN temp.groupingID = 1 THEN temp.[SHIP DATE] END AS' + N'[ship date] ');
SET @query_From = N'FROM #workorders_W_GroupingID AS temp ';
SET @query_Into = N' INTO ##RESULTS_2017_06_28';
SET @query_OrderBy = N'Order by BY CUSTOMER, [SHIP DATE] ';
SET @query = @query_Select + ' ' + @query_Into + ' ' + @query_From; --+ -- ' ' + @query_GroupBy
execute (@query);
SELECT *
FROM ##RESULTS_2017_06_28
WHERE CUSTOMER IS NOT NULL
/*ORDER OF COLUMNS IS WRONG SEE https://stackoverflow.com/questions/982286/tsql-string-concat-with-select-and-order-by-does-not-work-with-function-in-order
Currently do not see a way to fix. Data appears to be correct.
*/
/*
SELECT *
FROM ##RESULTS_2017_06_28
WHERE CUSTOMER IS NOT NULL
ORDER BY
CASE
*/
DROP TABLE #workorders_W_GroupingID, ##RESULTS_2017_06_28;
--VARIABLES
DECLARE @workorders AS TABLE
(
[PO] NVARCHAR(10),
[CUSTOMER] NVARCHAR(200),
[CUST PN] INT,
[PN] INT,
[DESC] NVARCHAR(500),
[QTY] INT,
[SHIP DATE] DATE
);
--COUNTER
DECLARE @CUNTER INT;
DECLARE @MAX_CUNTER INT;
--CREATE TEST DATA
INSERT @workorders
(
[PO],
CUSTOMER,
[CUST PN],
PN,
[DESC],
QTY,
[SHIP DATE]
)
VALUES
('001', N'xxx', 111, 100200, N'description1', 24, '2017-06-27'),
('002', N'xxx', 112, 100200, N'description2', 24, '2017-06-27'),
('003', N'xxx', 113, 100200, N'description3', 24, '2017-06-28'),
('004', N'xxx', 114, 100200, N'description4', 24, '2017-06-25'),
('005', N'aaa', 115, 100200, N'description5', 24, '2017-06-27'),
('006', N'aaa', 116, 100200, N'description6', 24, '2017-06-28'),
('007', N'aaa', 117, 100200, N'description7', 24, '2017-06-28'),
('008', N'ccc', 118, 100200, N'description8', 24, '2017-06-27'),
('009', N'xxx', 119, 100200, N'description9', 24, '2017-06-27');
--INSERT INTO @workorders_W_GroupingID
SELECT ROW_NUMBER() OVER (PARTITION BY S.CUSTOMER, S.[SHIP DATE] ORDER BY S.[PO]) AS groupingID,
S.*
INTO #workorders_W_GroupingID
FROM @workorders S;
SELECT * FROM #workorders_W_GroupingID;--DISPLAY
--INITIALIZE COUNTER VARIABLES
SET @MAX_CUNTER =
(
SELECT MAX(groupingID) + 1 FROM #workorders_W_GroupingID
);
SET @CUNTER = 1;
DECLARE @query_Select NVARCHAR(MAX),
@query_From NVARCHAR(MAX),
@query_Into NVARCHAR(MAX),
@query_OrderBy NVARCHAR(MAX),
@query NVARCHAR(MAX);
SET @query_Select = N'SELECT ';
----PO----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT PO FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'PO' + CONVERT(NVARCHAR(100), @CUNTER) + ',');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----CUSTOMER----
SET @query_Select = @query_Select + (' CASE WHEN temp.groupingID = 1 THEN temp.CUSTOMER END AS' + N' customer, ');
----CUST PN----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT [CUST PN] FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'[CUST PN' + CONVERT(NVARCHAR(100), @CUNTER) + '],');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----PN----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT PN FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'PN' + CONVERT(NVARCHAR(100), @CUNTER) + ',');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----DESC----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT [DESC] FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'DESC' + CONVERT(NVARCHAR(100), @CUNTER) + ',');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----QTY----
WHILE (@CUNTER < @MAX_CUNTER)
BEGIN
--ADD COLUMN
SET @query_Select
= @query_Select
+ (' CASE WHEN temp.groupingID = 1 THEN (SELECT QTY FROM #workorders_W_GroupingID WHERE customer = temp.customer AND [ship date] = temp.[ship date] AND GroupingID = '
+ CONVERT(NVARCHAR(100), @CUNTER) + ') END AS ' + N'QTY' + CONVERT(NVARCHAR(100), @CUNTER) + ',');
--INCREASE CUNTER
SET @CUNTER = @CUNTER + 1;
END;
--RESET CUNTER
SET @CUNTER = 1;
----SHIP DATE----
SET @query_Select = @query_Select + (' CASE WHEN temp.groupingID = 1 THEN temp.[SHIP DATE] END AS' + N'[ship date] ');
SET @query_From = N'FROM #workorders_W_GroupingID AS temp ';
SET @query_Into = N' INTO ##RESULTS_2017_06_28';
SET @query_OrderBy = N'Order by BY CUSTOMER, [SHIP DATE] ';
SET @query = @query_Select + ' ' + @query_Into + ' ' + @query_From; --+ -- ' ' + @query_GroupBy
execute (@query);
SELECT *
FROM ##RESULTS_2017_06_28
WHERE CUSTOMER IS NOT NULL
/*ORDER OF COLUMNS IS WRONG SEE https://stackoverflow.com/questions/982286/tsql-string-concat-with-select-and-order-by-does-not-work-with-function-in-order
Currently do not see a way to fix. Data appears to be correct.
*/
/*
SELECT *
FROM ##RESULTS_2017_06_28
WHERE CUSTOMER IS NOT NULL
ORDER BY
CASE
*/
DROP TABLE #workorders_W_GroupingID, ##RESULTS_2017_06_28;
/*Results
PO1 PO2 PO3 customer CUST PN1 CUST PN2 CUST PN3 PN1 PN2 PN3 DESC1 DESC2 DESC3 QTY1 QTY2 QTY3 ship date
005 NULL NULL aaa 115 NULL NULL 100200 NULL NULL description5 NULL NULL 24 NULL NULL 2017-06-27
006 007 NULL aaa 116 117 NULL 100200 100200 NULL description6 description7 NULL 24 24 NULL 2017-06-28
008 NULL NULL ccc 118 NULL NULL 100200 NULL NULL description8 NULL NULL 24 NULL NULL 2017-06-27
004 NULL NULL xxx 114 NULL NULL 100200 NULL NULL description4 NULL NULL 24 NULL NULL 2017-06-25
001 002 009 xxx 111 112 119 100200 100200 100200 description1 description2 description9 24 24 24 2017-06-27
003 NULL NULL xxx 113 NULL NULL 100200 NULL NULL description3 NULL NULL 24 NULL NULL 2017-06-28
*/