[英]How to create a 2nd temp table in SQL
我有這樣的情況。 我基本上需要將我的整個代碼放入第二個臨時表(?),以便能夠從中獲取 select。 里面的代碼工作得很好我只是不明白如何基本上創建一個更大的臨時表來吸收第一個和以前的 select 和以后允許 select 一次。
這就是我現在所擁有的
WITH t AS
( Select
p.[PDITM#], l.SGDWHS, p.PDCHN, p.PDWEDT, Sum(p.PDQSLD) AS 'Sum',
case when p.PDCHN = 'DH' then p.PDQSLD else 0 end as DHSLD,
case when p.PDCHN = 'WM' then p.PDQSLD else 0 end as WMSLD,
case when p.PDCHN = 'MJ' then p.PDQSLD else 0 end as MJSLD,
case when p.PDCHN = 'BJ' then p.PDQSLD else 0 end as BJSLD
FROM [Repit].[LEVYDTA].[POSDTLM] p
LEFT OUTER JOIN [Repit].[LEVYDTA].[LDSSGEN] l
ON p.[PDAGY]=l.[SGAGY] AND p.[PDCHN] = l.[SGCHN] AND p.[PDSTR] = l.[SGSTR]
WHERE p.[PDQSLD] > 0 AND p.[PDAGY] != 15
AND l.[SGDWHS] IN (01, 21, 30, 40, 02)
AND CONVERT(DATE, CONVERT(CHAR(8), p.PDWEDT )) = cast(DATEADD(dd, DATEPART(DW,GETDATE())*-1, GETDATE()) as date)
GROUP BY p.[PDITM#], l.[SGDWHS], p.[PDCHN], p.[PDWEDT], p.[PDQSLD]
)
select t.[PDITM#] as [PDITM#],
t.SGDWHS as [SGDWHS],
SUM(t.Sum) as [PDQSLD],
SUM(t.DHSLD) AS [DHSLD],
SUM(t.WMSLD) AS [WMSLD],
SUM(t.MJSLD) AS [MJSLD],
SUM(t.BJSLD) AS [BJSLD],
SUM(t.Sum) - (SUM(t.DHSLD) + SUM(t.WMSLD) + SUM(t.MJSLD) + SUM(t.BJSLD)) as OTHRSLD
from t
GROUP BY t.PDITM#, t.SGDWHS
ORDER BY t.PDITM#, t.SGDWHS
我需要上表中的 select 這樣的字段
SELECT t.PDITM#, t.SGDWHS,
CAST((t.DHSLD/t.Sum) * 100 as DECIMAL (18,2)) AS 'DHPCT',
CAST((t.WMSLD/t.Sum) * 100 as DECIMAL (18,2)) AS 'WMPCT',
CAST((t.MJSLD/t.Sum) * 100 as DECIMAL (18,2)) AS 'MJPCT',
CAST((t.BJSLD/t.Sum) * 100 as DECIMAL (18,2)) AS 'BJPCT',
CAST(((t.Sum - ( t.DHSLD + t.WMSLD + t.MJSLD + t.BJSLD))/t.Sum) * 100 as DECIMAL (18,2)) AS 'OTHRPCT'
FROM second temp table
如果有人能讓我知道這怎么可能,我將不勝感激。 我花了一些時間試圖自己弄清楚,但是當您需要制作多個臨時表並選擇它們時,沒有太多信息。
如果您使用的是 MSSQL,這可能是您想要做的嗎?
-- Drop temp table if already present
DROP TABLE IF EXISTS #temp_main
SELECT
p.[PDITM#]
, l.SGDWHS
, p.PDCHN
, p.PDWEDT
, SUM(p.PDQSLD) AS [Sum_PDQSLD]
, case when p.PDCHN = 'DH' then p.PDQSLD else 0 end as [DHSLD]
, case when p.PDCHN = 'WM' then p.PDQSLD else 0 end as [WMSLD]
, case when p.PDCHN = 'MJ' then p.PDQSLD else 0 end as [MJSLD]
, case when p.PDCHN = 'BJ' then p.PDQSLD else 0 end as [BJSLD]
-- Select data into temp table.
INTO #temp_main
FROM [Repit].[LEVYDTA].[POSDTLM] AS p
LEFT JOIN [Repit].[LEVYDTA].[LDSSGEN] AS l
ON p.[PDAGY]=l.[SGAGY] AND p.[PDCHN] = l.[SGCHN] AND p.[PDSTR] = l.[SGSTR]
WHERE p.[PDQSLD] > 0 AND p.[PDAGY] != 15 AND l.[SGDWHS] IN (01, 21, 30, 40, 02)
AND CONVERT(DATE, CONVERT(CHAR(8), p.PDWEDT)) = cast(DATEADD(dd, DATEPART(DW,GETDATE())*-1, GETDATE()) as date)
GROUP BY
p.[PDITM#]
, l.[SGDWHS]
, p.[PDCHN]
, p.[PDWEDT]
, p.[PDQSLD]
-- Table 1
SELECT
t.[PDITM#]
, t.SGDWHS
, SUM(t.Sum_PDQSLD) as [PDQSLD]
, SUM(t.DHSLD) AS [DHSLD]
, SUM(t.WMSLD) AS [WMSLD]
, SUM(t.MJSLD) AS [MJSLD]
, SUM(t.BJSLD) AS [BJSLD]
, SUM(t.Sum_PDQSLD) - (SUM(t.DHSLD) + SUM(t.WMSLD) + SUM(t.MJSLD) + SUM(t.BJSLD)) as [OTHRSLD]
from #temp_main AS t -- Temp table
GROUP BY t.[PDITM#], t.SGDWHS
ORDER BY t.[PDITM#], t.SGDWHS
-- Table 2
SELECT
t.[PDITM#]
, t.SGDWHS
, CAST((t.DHSLD/t2.Sum_PDQSLD) * 100 as DECIMAL (18,2)) AS [DHPCT]
, CAST((t.WMSLD/t.Sum_PDQSLD) * 100 as DECIMAL (18,2)) AS [WMPCT]
, CAST((t.MJSLD/t.Sum_PDQSLD) * 100 as DECIMAL (18,2)) AS [MJPCT]
, CAST((t.BJSLD/t.Sum_PDQSLD) * 100 as DECIMAL (18,2)) AS [BJPCT]
, CAST(((t.Sum_PDQSLD - (t.DHSLD + t.WMSLD + t.MJSLD + t.BJSLD))/t.Sum_PDQSLD) * 100 as DECIMAL (18,2)) AS [OTHRPCT]
FROM #temp_main AS t -- Temp table
ORDER BY t.[PDITM#], t.SGDWHS
-- Drop table once complete.
DROP TABLE #table_main
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.