繁体   English   中英

使用case表达式将数据插入表中

[英]Inserting data into a table with a case expression

在我收到的邮政编码文件中,应该为每个邮政编码提供DMA(直销区域)。 但是,DMA的某些值为“”。 为了解决此问题,我应该将最常见的DMA用于邮编所在的县,并将其放入邮编的DMA中。

目前,我已经弄清楚了如何确定每个县中DMA的最大出现次数。 例如,我知道在阿贝维尔县,最频繁的DMA出现了5次,而对于阿卡迪亚,则是10倍。 此数据存储在使用以下代码创建的临时表#Temp2中:

INSERT INTO #Temp
    SELECT ROW_NUMBER() OVER(PARTITION BY County, DMA ORDER BY County DESC) AS Num, County, DMA
    FROM [HPW Data].[dbo].[Zip_Codes_All]
    WHERE DMA <> '<NULL>'
INSERT INTO #Temp2 
    SELECT DISTINCT MAX(Num), County
    FROM #Temp 
    GROUP BY County

在将邮政编码表划分为包含County,DMA和Num的段(这是任何County,DMA组合的出现次数)后,我通过找到最大行数来实现这一点

之后,我编写了这段代码,试图将邮政编码表中的''值替换为该县最频繁的DMA

INSERT INTO [HPW Data].[dbo].[Zip_Codes_All]
    SELECT Zip_Code, c.County, 
        CASE c.DMA
            WHEN '<NULL>' THEN (SELECT d.DMA WHERE c.County = d.County)
            ELSE c.DMA END AS DMA
        FROM [HPW Data].[dbo].[Zip_Codes_All] AS c,
        (SELECT a.County, DMA FROM #Temp AS a, #Temp2 AS b WHERE a.Num = b.Num AND a.County = b.County) AS d

我认为它不能按预期工作的部分原因是因为某些DMA作为县中最常出现的DMA并列(例如:Adair County的三个DMA出现了五次,而最多的DMA出现了五次)。

我对此进行了快速尝试,我认为您的问题的一部分是1990年代的JOIN语法?

WITH ZipCodeDMAs AS (
    SELECT 
        County, 
        DMA,
        COUNT(*) AS freq
    FROM 
        [HPW Data].dbo.Zip_Codes_All
    WHERE 
        DMA != '<NULL>'
    GROUP BY
        County,
        DMA),
MaxDMA AS (
    SELECT
        County,
        DMA,
        ROW_NUMBER() OVER (PARTITION BY County ORDER BY freq DESC) AS order_id
    FROM
        ZipCodeDMAs)
INSERT INTO 
    [HPW Data].dbo.Zip_Codes_All
SELECT 
    Zip_Code, 
    c.County, 
    ISNULL(c.DMA, m.DMA) AS DMA
FROM 
    [HPW Data].dbo.Zip_Codes_All c
    INNER JOIN MaxDMA m ON m.County = c.County AND m.order_id = 1;

这使用两个CTE来:-获取County-DMA元组的频率; -确定每个县最频繁的DMA(允许联系-在“随机”中选择一个)。

这只是在我们的数据中没有一个的情况下,在最频繁的DMA中进行交换的情况。 这假定您的数据将永远不会有我们以前从未拥有过DMA的“新”县,否则INNER JOINs将中断查询。

我并没有真正遵循您的示例,您似乎正在使用ROW_NUMBER()提出一些次优的计数频率方法,然后在其余的代码中使用该方法。 SELECT * FROM a, b, c大约在20年前就过时了!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM