【问题标题】:I have problem in query sql, this issue Msg 8156, Level 16, State 1, Line 77 The column 'flag_valid' was specified multiple times for 'd' [closed]我在查询 sql 中遇到问题,此问题 Msg 8156,Level 16,State 1,Line 77 列 'flag_valid' 被多次指定为 'd' [关闭]
【发布时间】:2020-06-05 03:33:39
【问题描述】:

我的 SQL 查询有问题:

消息 8156,第 16 层,状态 1,第 77 行
为“d”多次指定了“flag_valid”列

代码:

SELECT
    d.ID_TEMP
    ,LEFT(d.tanggal, 4) AS year
    ,SUBSTRING(d.tanggal, 5, 2) AS bulan
    ,RIGHT(d.tanggal, 2) AS tanggal
    ,d.jenis_rekening
    ,d.status_penerima
    ,d.kategori_penerima
    ,d.status_pembayar
    ,d.kategori_pembayar
    ,d.hubungan_keuangan
    ,d.sandi_negara
    ,d.jenis_valuta
    ,d.nilai_transaksi
    ,d.in_out
    ,d.tujuan_transaksi
    ,d.kode_cabang
    ,flag_transaksi = CASE WHEN d.jenis_rekening = '3C'
            AND CAST(d.nilai_transaksi2 AS FLOAT) <= CAST('10000' AS FLOAT) THEN 'K' WHEN SUBSTRING(d.kode_swift_bank_pengirim, 5, 2) = 'ID'
            AND SUBSTRING(d.kode_swift_bank_penerima, 5, 2) = 'ID'
            AND d.in_out = '1' THEN 'K' WHEN d.jenis_rekening = '3C'
            AND CAST(d.nilai_transaksi2 AS FLOAT) > CAST('10000' AS FLOAT) THEN 'L' ELSE 'K' END
    ,d.nama_penerima
    ,d.jenis_no_identifikasi_penerima
    ,d.no_identifikasi_penerima
    ,d.nama_pembayar
    ,d.jenis_no_identifikasi_pembayar
    ,d.no_identifikasi_pembayar
    ,d.kode_swift_bank_pengirim
    ,d.kode_swift_bank_penerima
    ,d.detail_transaksi
    ,d.tujuan_transaksi_2015
    ,d.dokumen
    ,d.gol_debitur_penerima
    ,d.gol_debitur_pembayar
    ,d.dokumen_pendukung_lld1
    ,d.periode
    ,d.kurs_asli
    ,d.kurs_dollar
    ,d.flag_kurs
    ,d.flag_valid
    ,d.Jenis_Rekening_lld2
    ,d.Jenis_Valuta_lld2
    ,d.Sandi_Negara_lld2
    ,d.sandi_bank
    ,mp.IDPosisi
FROM
    (SELECT 
         c.ID_TEMP
        ,c.kode_cabang
        ,c.tanggal
        ,c.jenis_rekening
        ,c.status_penerima
        ,c.kategori_penerima
        ,c.status_pembayar
        ,c.kategori_pembayar
        ,c.hubungan_keuangan
        ,c.sandi_negara
        ,c.jenis_valuta
        ,c.nilai_transaksi
        ,c.in_out
        ,c.tujuan_transaksi
        ,c.tujuan_transaksi_2015
        ,c.nama_penerima
        ,c.jenis_no_identifikasi_penerima
        ,c.nama_pembayar
        ,c.jenis_no_identifikasi_pembayar
        ,c.kode_swift_bank_pengirim
        ,c.nomor_ft
        ,c.f_id
        ,c.negara_depository
        ,c.no_identifikasi_penerima
        ,c.jenis_identifikasi_pembayar
        ,c.no_identifikasi_pembayar
        ,c.kode_swift_bank_penerima
        ,c.detail_transaksi
        ,c.dokumen
        ,c.gol_debitur_penerima
        ,c.gol_debitur_pembayar
        ,c.dokumen_pendukung_lld1
        ,c.periode
        ,c.kurs_asli
        ,c.kurs_dollar
        ,c.flag_kurs
        ,c.flag_valid
        ,nilai_transaksi2 = CASE WHEN c.jenis_rekening = '3C'
                AND c.jenis_valuta <> 'USD'
                AND c.flag_kurs = '1' THEN ROUND(ROUND(CAST(c.nilai_transaksi AS FLOAT) * CAST(c.kurs_asli AS FLOAT), 2) / CAST(c.kurs_dollar AS FLOAT), 2) WHEN c.jenis_rekening = '3C'
                AND c.jenis_valuta <> 'USD'
                AND c.flag_kurs = '0' THEN '0' WHEN c.jenis_rekening = '3C'
                AND c.jenis_valuta = 'USD'
                AND c.flag_kurs = '0' THEN '0' WHEN c.jenis_rekening <> '3C'
                AND c.flag_kurs = '0' THEN '0' ELSE c.nilai_transaksi END
        ,c.flag_valid
        ,c.Jenis_Rekening_lld2
        ,c.Jenis_Valuta_lld2
        ,c.Sandi_Negara_lld2
        ,c.sandi_bank
    FROM (
        SELECT b.ID_TEMP
            ,b.kode_cabang
            ,b.tanggal
            ,b.jenis_rekening
            ,b.status_penerima
            ,b.kategori_penerima
            ,b.status_pembayar
            ,b.kategori_pembayar
            ,b.hubungan_keuangan
            ,b.sandi_negara
            ,b.jenis_valuta
            ,b.nilai_transaksi
            ,b.in_out
            ,b.tujuan_transaksi
            ,b.tujuan_transaksi_2015
            ,b.nama_penerima
            ,b.jenis_no_identifikasi_penerima
            ,b.nama_pembayar
            ,b.jenis_no_identifikasi_pembayar
            ,b.kode_swift_bank_pengirim
            ,b.nomor_ft
            ,b.f_id
            ,b.negara_depository
            ,b.no_identifikasi_penerima
            ,b.jenis_identifikasi_pembayar
            ,b.no_identifikasi_pembayar
            ,b.kode_swift_bank_penerima
            ,b.detail_transaksi
            ,b.dokumen
            ,b.gol_debitur_penerima
            ,b.gol_debitur_pembayar
            ,b.dokumen_pendukung_lld1
            ,b.periode
            ,b.kurs_asli
            ,b.kurs_dollar
            ,b.flag_valid
            ,flag_kurs = CASE WHEN b.kurs_asli <> '0'
                    AND b.kurs_dollar <> '0' THEN '1' ELSE '0' END
            ,b.Jenis_Rekening_lld2
            ,b.Jenis_Valuta_lld2
            ,b.Sandi_Negara_lld2
            ,b.sandi_bank
        FROM (
            SELECT a.ID_TEMP
                ,a.kode_cabang
                ,a.tanggal
                ,a.jenis_rekening
                ,a.status_penerima
                ,a.kategori_penerima
                ,a.status_pembayar
                ,a.kategori_pembayar
                ,a.hubungan_keuangan
                ,a.sandi_negara
                ,a.jenis_valuta
                ,a.nilai_transaksi
                ,a.in_out
                ,a.tujuan_transaksi
                ,a.tujuan_transaksi_2015
                ,a.nama_penerima
                ,a.jenis_no_identifikasi_penerima
                ,a.nama_pembayar
                ,a.jenis_no_identifikasi_pembayar
                ,a.kode_swift_bank_pengirim
                ,a.nomor_ft
                ,a.f_id
                ,a.negara_depository
                ,a.no_identifikasi_penerima
                ,a.jenis_identifikasi_pembayar
                ,a.no_identifikasi_pembayar
                ,a.kode_swift_bank_penerima
                ,a.detail_transaksi
                ,a.dokumen
                ,a.gol_debitur_penerima
                ,a.gol_debitur_pembayar
                ,a.dokumen_pendukung_lld1
                ,a.periode
                ,a.flag_valid
                ,a.Jenis_Rekening_lld2
                ,a.Jenis_Valuta_lld2
                ,a.Sandi_Negara_lld2
                ,a.sandi_bank
                ,ISNULL(mk.kurs, 0) AS kurs_asli
                ,ISNULL(mk2.kurs, 0) AS kurs_dollar
            FROM (
                SELECT ttt.ID_TEMP
                    ,ttt.kode_cabang
                    ,ttt.tanggal
                    ,ttt.jenis_rekening
                    ,ttt.status_penerima
                    ,ttt.kategori_penerima
                    ,ttt.status_pembayar
                    ,ttt.kategori_pembayar
                    ,ttt.hubungan_keuangan
                    ,ttt.sandi_negara
                    ,ttt.jenis_valuta
                    ,ttt.nilai_transaksi
                    ,ttt.in_out
                    ,ttt.tujuan_transaksi
                    ,ttt.tujuan_transaksi_2015
                    ,ttt.nama_penerima
                    ,ttt.jenis_no_identifikasi_penerima
                    ,ttt.nama_pembayar
                    ,ttt.jenis_no_identifikasi_pembayar
                    ,ttt.kode_swift_bank_pengirim
                    ,ttt.nomor_ft
                    ,ttt.f_id
                    ,ttt.negara_depository
                    ,ttt.no_identifikasi_penerima
                    ,ttt.jenis_identifikasi_pembayar
                    ,ttt.no_identifikasi_pembayar
                    ,ttt.kode_swift_bank_penerima
                    ,ttt.detail_transaksi
                    ,ttt.dokumen
                    ,ttt.gol_debitur_penerima
                    ,ttt.gol_debitur_pembayar
                    ,ttt.dokumen_pendukung_lld1
                    ,RIGHT('00' + CAST(MONTH(CAST(ttt.tanggal AS SMALLDATETIME)) AS VARCHAR(2)), 2) + '' + CAST(YEAR(CAST(ttt.tanggal AS SMALLDATETIME)) AS VARCHAR(4)) AS periode
                    ,ttt.flag_valid
                    ,mmll.Jenis_Rekening_lld2
                    ,mmll.Jenis_Valuta_lld2
                    ,mmll.Sandi_Negara_lld2
                    ,'153' + ttt.kode_cabang AS sandi_bank
                FROM TRX_TRANSAKSI_TEMP2 ttt
                LEFT JOIN MST_MAPPING_LLD1_LLD2 mmll
                    ON ttt.jenis_rekening = mmll.Jenis_Rekening_lld1
                        AND ttt.jenis_valuta = mmll.Jenis_Valuta_lld1
                        AND ttt.sandi_negara = mmll.Sandi_Negara_lld1
                WHERE Flag_Process = '0'
                    AND MONTH(CAST(ttt.tanggal AS SMALLDATETIME)) = '02'
                    AND YEAR(CAST(ttt.tanggal AS SMALLDATETIME)) = '2020'
                ) a
            LEFT JOIN MST_KURS mk
                ON mk.periode = a.periode
                    AND mk.sandi_valuta = a.jenis_valuta
            LEFT JOIN MST_KURS mk2
                ON mk2.periode = a.periode
                    AND mk2.sandi_valuta = 'USD'
            LEFT JOIN MST_POSISI mp
                ON a.Jenis_Rekening_lld2 = mp.Jenis_Rekening
                    AND a.Jenis_Valuta_lld2 = mp.Jenis_Valuta
                    AND a.Sandi_Negara_lld2 = mp.Sandi_Negara
                    AND a.sandi_bank = mp.Sandi_Bank
            ) b
        ) c
    ) d
LEFT JOIN MST_POSISI mp
    ON d.Jenis_Rekening_lld2 = mp.Jenis_Rekening
        AND d.Jenis_Valuta_lld2 = mp.Jenis_Valuta
        AND d.Sandi_Negara_lld2 = mp.Sandi_Negara
        AND d.sandi_bank = mp.Sandi_Bank
WHERE flag_valid = 'Y'
    AND (
        kode_cabang = 'ID0010002'
        OR d.kode_cabang IN (
            'ID0010002'
            ,'ID0010204'
            )
        )

【问题讨论】:

    标签: sql-server join select


    【解决方案1】:

    在子查询中,您有两次相同的列名。因此,您会收到错误消息。列名应该是唯一的

        ,c.flag_valid -- First Time
            ,nilai_transaksi2 = CASE WHEN c.jenis_rekening = '3C'
                    AND c.jenis_valuta <> 'USD'
                    AND c.flag_kurs = '1' THEN ROUND(ROUND(CAST(c.nilai_transaksi AS FLOAT) * CAST(c.kurs_asli AS FLOAT), 2) / CAST(c.kurs_dollar AS FLOAT), 2) WHEN c.jenis_rekening = '3C'
                    AND c.jenis_valuta <> 'USD'
                    AND c.flag_kurs = '0' THEN '0' WHEN c.jenis_rekening = '3C'
                    AND c.jenis_valuta = 'USD'
                    AND c.flag_kurs = '0' THEN '0' WHEN c.jenis_rekening <> '3C'
                    AND c.flag_kurs = '0' THEN '0' ELSE c.nilai_transaksi END
            ,c.flag_valid -- Second Time 
    

    对于 FROM 子句中引用的子查询,您需要具有唯一的名称。

    select * from
    (
    select column1, column1 from table
    ) as t
    

    消息 8156,第 16 级,状态 1,第 6 行 为“t”多次指定了“column1”列。

    【讨论】:

    • 是的,你的输入是正确的,我得到了想要的结果,谢谢@Venkataraman!
    【解决方案2】:

    您选择 c.flag_valid 两次,这会导致子查询中有 2 个同名的列。

    【讨论】:

    • 谢谢,您的意见让道路变得更好@wouter!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多